Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,61 @@ All notable changes to this project will be documented in this file.

The format is based on `Keep a Changelog <http://keepachangelog.com/>`__.

3.83.0 - 2026-05-19
-------------------
Added
~~~~~
* Generative AI Inference service

* Support for new optional parameter ``--guardrail-version-config`` to support applying guardrails with guardrail version

* ``oci generative-ai-inference apply-guardrails-result apply-guardrails --guardrail-version-config``
* ``oci generative-ai-inference apply-guardrails-result apply-guardrails-guardrails-text-input --guardrail-version-config``

* Support to list all the OCI GenAI Guardrails version with their accuracy and performance

* ``oci generative-ai-inference guardrail-version-collection list-guardrail-versions``

* Support for new optional parameter ``--compute-count`` for compute count options in Resource Analytics service

* ``oci resource-analytics resource-analytics-instance create --compute-count``

* Support for the Cost Anomaly Detection service

* ``oci costad``

* Support for new optional parameter ``--heterogeneous-shapes`` to provide a heterogeneous shape to replace a cluster node in Big Data Service

* ``oci bds instance replace-node --heterogeneous-shapes``

* Streaming service

* Support for new optional parameters ``--max-wait-seconds``, ``--wait-for-state`` and ``--wait-interval-seconds`` for commands to change compartments

* ``oci streaming admin connect-harness change-compartment --max-wait-seconds, --wait-for-state, --wait-interval-seconds``
* ``oci streaming admin stream change-compartment --max-wait-seconds, --wait-for-state, --wait-interval-seconds``
* ``oci streaming admin stream-pool change-compartment --max-wait-seconds, --wait-for-state, --wait-interval-seconds``

* Support for WorkRequest APIs to track progress of create/update/delete operations of Stream, Stream Pool and Kafka Connect Configuration resources.

* ``oci streaming admin work-request get``
* ``oci streaming admin work-request-error-collection list-work-request-errors``
* ``oci streaming admin work-request-log-entry list-work-request-logs``
* ``oci streaming admin work-request-summary-collection list-work-requests``

Changed
~~~~~~~
* Big Data service

* [BREAKING] Removed optional parameters ``--cluster-admin-password`` and ``--secret-id`` to create a BDS certificate configuration

* ``oci bds instance create-bds-certificate-configuration``

* ``--node-backup-id`` is now an optional parameter to repace a node of a BDS cluster from backup

* ``oci bds instance replace-node``


3.82.0 - 2026-05-12
-------------------
Added
Expand Down
4 changes: 2 additions & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Jinja2>=3.1.5,<4.0.0; python_version >= '3.7'
jmespath>=0.10.0,<=1.0.1
ndg-httpsclient==0.4.2
mock==2.0.0
oci==2.174.0
oci==2.175.0
packaging>=22.0,<25.0; python_version > '3.8'
packaging==20.2; python_version <= '3.8'
pluggy==0.13.0
Expand Down Expand Up @@ -55,4 +55,4 @@ setuptools==68.0.0; python_version == '3.7'
setuptools==59.6.0; python_version == '3.6'
# this is required because of python 3.6 requests dependency version bound
urllib3==2.6.3; python_version >= '3.10'
urllib3==1.26.20; python_version < '3.10'
urllib3==1.26.20; python_version < '3.10'
28 changes: 13 additions & 15 deletions services/bds/src/oci_cli_bds/generated/bds_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -1801,8 +1801,6 @@ def create_bds_capacity_report(ctx, from_json, compartment_id, shape_availabilit
@cli_util.option('--certificate-type', required=True, help=u"""The type of the BDS certificate configuration, also the type of the BDS certificates which will be generated by the BDS certificate configuration.""")
@cli_util.option('--certificate-authority-id', help=u"""The OCID of the certificate authority which is associated with this certificate configuration.""")
@cli_util.option('--compartment-id', help=u"""The OCID of the compartment of the certificate authority connecting to this certificate configuration.""")
@cli_util.option('--cluster-admin-password', help=u"""Base-64 encoded password for the cluster admin user.""")
@cli_util.option('--secret-id', help=u"""The secretId for the clusterAdminPassword.""")
@cli_util.option('--wait-for-state', type=custom_types.CliCaseInsensitiveChoice(["ACCEPTED", "IN_PROGRESS", "FAILED", "SUCCEEDED", "CANCELING", "CANCELED"]), multiple=True, help="""This operation asynchronously creates, modifies or deletes a resource and uses a work request to track the progress of the operation. Specify this option to perform the action and then wait until the work request reaches a certain state. Multiple states can be specified, returning on the first state. For example, --wait-for-state ACCEPTED --wait-for-state CANCELED would return on whichever lifecycle state is reached first. If timeout is reached, a return code of 2 is returned. For any other error, a return code of 1 is returned.""")
@cli_util.option('--max-wait-seconds', type=click.INT, help="""The maximum time to wait for the work request to reach the state defined by --wait-for-state. Defaults to 1200 seconds.""")
@cli_util.option('--wait-interval-seconds', type=click.INT, help="""Check every --wait-interval-seconds to see whether the work request has reached the state defined by --wait-for-state. Defaults to 30 seconds.""")
Expand All @@ -1811,7 +1809,7 @@ def create_bds_capacity_report(ctx, from_json, compartment_id, shape_availabilit
@click.pass_context
@json_skeleton_utils.json_skeleton_generation_handler(input_params_to_complex_types={})
@cli_util.wrap_exceptions
def create_bds_certificate_configuration(ctx, from_json, wait_for_state, max_wait_seconds, wait_interval_seconds, bds_instance_id, display_name, certificate_type, certificate_authority_id, compartment_id, cluster_admin_password, secret_id):
def create_bds_certificate_configuration(ctx, from_json, wait_for_state, max_wait_seconds, wait_interval_seconds, bds_instance_id, display_name, certificate_type, certificate_authority_id, compartment_id):

if isinstance(bds_instance_id, six.string_types) and len(bds_instance_id.strip()) == 0:
raise click.UsageError('Parameter --bds-instance-id cannot be whitespace or empty string')
Expand All @@ -1829,12 +1827,6 @@ def create_bds_certificate_configuration(ctx, from_json, wait_for_state, max_wai
if compartment_id is not None:
_details['compartmentId'] = compartment_id

if cluster_admin_password is not None:
_details['clusterAdminPassword'] = cluster_admin_password

if secret_id is not None:
_details['secretId'] = secret_id

client = cli_util.build_client('bds', 'bds', ctx)
result = client.create_bds_certificate_configuration(
bds_instance_id=bds_instance_id,
Expand Down Expand Up @@ -4917,7 +4909,7 @@ def list_bds_api_keys(ctx, from_json, all_pages, page_size, bds_instance_id, lif
@cli_util.option('--sort-by', type=custom_types.CliCaseInsensitiveChoice(["timeCreated", "displayName"]), help=u"""The field to sort by. Only one sort order may be provided. Default order for timeCreated is descending. Default order for displayName is ascending. If no value is specified timeCreated is default.""")
@cli_util.option('--sort-order', type=custom_types.CliCaseInsensitiveChoice(["ASC", "DESC"]), help=u"""The sort order to use, either 'asc' or 'desc'.""")
@cli_util.option('--display-name', help=u"""A filter to return only resources that match the entire display name given.""")
@cli_util.option('--lifecycle-state', type=custom_types.CliCaseInsensitiveChoice(["CREATING", "ACTIVE", "DELETING", "DELETED", "FAILED"]), help=u"""The state of the BdsCertificateConfiguration.""")
@cli_util.option('--lifecycle-state', type=custom_types.CliCaseInsensitiveChoice(["CREATING", "ACTIVE", "DELETING", "DELETED", "FAILED", "UPDATING"]), help=u"""The state of the BdsCertificateConfiguration.""")
@cli_util.option('--all', 'all_pages', is_flag=True, help="""Fetches all pages of results. If you provide this option, then you cannot provide the --limit option.""")
@cli_util.option('--page-size', type=click.INT, help="""When fetching results, the number of results to fetch per call. Only valid when used with --all or --limit, and ignored otherwise.""")
@json_skeleton_utils.get_cli_json_input_option({})
Expand Down Expand Up @@ -6828,20 +6820,21 @@ def renew_certificate(ctx, from_json, wait_for_state, max_wait_seconds, wait_int
@bds_instance_group.command(name=cli_util.override('bds.replace_node.command_name', 'replace-node'), help=u"""Replaces a node of a Big Data Service cluster from backup. \n[Command Reference](replaceNode)""")
@cli_util.option('--bds-instance-id', required=True, help=u"""The OCID of the cluster.""")
@cli_util.option('--node-host-name', required=True, help=u"""Host name of the node to replace. MASTER, UTILITY and EDGE node are only supported types""")
@cli_util.option('--node-backup-id', required=True, help=u"""The id of the nodeBackup to use for replacing the node.""")
@cli_util.option('--node-backup-id', help=u"""The id of the nodeBackup to use for replacing the node.""")
@cli_util.option('--cluster-admin-password', help=u"""Base-64 encoded password for the cluster admin user.""")
@cli_util.option('--heterogeneous-shapes', type=custom_types.CLI_COMPLEX_TYPE, help=u"""Heterogeneous shape of the node if the default shape is not available.""" + custom_types.cli_complex_type.COMPLEX_TYPE_HELP)
@cli_util.option('--secret-id', help=u"""The secretId for the clusterAdminPassword.""")
@cli_util.option('--shape', help=u"""Shape of the new vm when replacing the node. If not provided, BDS will attempt to replace the node with the shape of current node.""")
@cli_util.option('--if-match', help=u"""This if-match is for the BdsInstance. For optimistic concurrency control. In the PUT or DELETE call for a resource, set the `if-match` parameter to the value of the etag from a previous GET or POST response for that resource. The resource will be updated or deleted only if the etag you provide matches the resource's current etag value.""")
@cli_util.option('--wait-for-state', type=custom_types.CliCaseInsensitiveChoice(["ACCEPTED", "IN_PROGRESS", "FAILED", "SUCCEEDED", "CANCELING", "CANCELED"]), multiple=True, help="""This operation asynchronously creates, modifies or deletes a resource and uses a work request to track the progress of the operation. Specify this option to perform the action and then wait until the work request reaches a certain state. Multiple states can be specified, returning on the first state. For example, --wait-for-state ACCEPTED --wait-for-state CANCELED would return on whichever lifecycle state is reached first. If timeout is reached, a return code of 2 is returned. For any other error, a return code of 1 is returned.""")
@cli_util.option('--max-wait-seconds', type=click.INT, help="""The maximum time to wait for the work request to reach the state defined by --wait-for-state. Defaults to 1200 seconds.""")
@cli_util.option('--wait-interval-seconds', type=click.INT, help="""Check every --wait-interval-seconds to see whether the work request has reached the state defined by --wait-for-state. Defaults to 30 seconds.""")
@json_skeleton_utils.get_cli_json_input_option({})
@json_skeleton_utils.get_cli_json_input_option({'heterogeneous-shapes': {'module': 'bds', 'class': 'list[string]'}})
@cli_util.help_option
@click.pass_context
@json_skeleton_utils.json_skeleton_generation_handler(input_params_to_complex_types={})
@json_skeleton_utils.json_skeleton_generation_handler(input_params_to_complex_types={'heterogeneous-shapes': {'module': 'bds', 'class': 'list[string]'}})
@cli_util.wrap_exceptions
def replace_node(ctx, from_json, wait_for_state, max_wait_seconds, wait_interval_seconds, bds_instance_id, node_host_name, node_backup_id, cluster_admin_password, secret_id, shape, if_match):
def replace_node(ctx, from_json, wait_for_state, max_wait_seconds, wait_interval_seconds, bds_instance_id, node_host_name, node_backup_id, cluster_admin_password, heterogeneous_shapes, secret_id, shape, if_match):

if isinstance(bds_instance_id, six.string_types) and len(bds_instance_id.strip()) == 0:
raise click.UsageError('Parameter --bds-instance-id cannot be whitespace or empty string')
Expand All @@ -6853,11 +6846,16 @@ def replace_node(ctx, from_json, wait_for_state, max_wait_seconds, wait_interval

_details = {}
_details['nodeHostName'] = node_host_name
_details['nodeBackupId'] = node_backup_id

if node_backup_id is not None:
_details['nodeBackupId'] = node_backup_id

if cluster_admin_password is not None:
_details['clusterAdminPassword'] = cluster_admin_password

if heterogeneous_shapes is not None:
_details['heterogeneousShapes'] = cli_util.parse_json_parameter("heterogeneous_shapes", heterogeneous_shapes)

if secret_id is not None:
_details['secretId'] = secret_id

Expand Down
30 changes: 15 additions & 15 deletions services/container_engine/tests/integ/test_containerengine.py
Original file line number Diff line number Diff line change
Expand Up @@ -373,12 +373,12 @@ def test_create_kubeconfig_1(config_file, config_profile, oce_cluster, request):
util.validate_response(result, json_response_expected=False)

# Check that a file got created at default kubeconfig location
assert(os.path.isfile(config_file_path))
assert (os.path.isfile(config_file_path))
# Check if it is a valid yaml. yaml load will raise an exception in case of invalid yaml
with open(config_file_path, 'r') as f:
kubeconfig = yaml.safe_load(f)
# Check there is only ONE cluster, user and context in the downloaded kubeconfig for this test.
assert(len(kubeconfig['clusters']) == 1)
assert (len(kubeconfig['clusters']) == 1)
assert (len(kubeconfig['contexts']) == 1)
assert (len(kubeconfig['users']) == 1)

Expand Down Expand Up @@ -437,9 +437,9 @@ def test_create_kubeconfig_2(config_file, config_profile, oce_cluster, request):
with open(config_file_path, 'r') as f:
kubeconfig = yaml.safe_load(f)
# Check there is ONE more cluster, user and context added in the merged kubeconnfig file.
assert(len(kubeconfig['clusters']) == len(sample_kubeconfig_yaml['clusters']) + 1)
assert(len(kubeconfig['contexts']) == len(sample_kubeconfig_yaml['contexts']) + 1)
assert(len(kubeconfig['users']) == len(sample_kubeconfig_yaml['users']) + 1)
assert (len(kubeconfig['clusters']) == len(sample_kubeconfig_yaml['clusters']) + 1)
assert (len(kubeconfig['contexts']) == len(sample_kubeconfig_yaml['contexts']) + 1)
assert (len(kubeconfig['users']) == len(sample_kubeconfig_yaml['users']) + 1)

# TEST 2B
# For this test, execute the command again
Expand All @@ -450,9 +450,9 @@ def test_create_kubeconfig_2(config_file, config_profile, oce_cluster, request):
with open(config_file_path, 'r') as f:
kubeconfig2 = yaml.safe_load(f)
# Check the number of clusters, users and contexts remained the same after the merge
assert(len(kubeconfig['clusters']) == len(kubeconfig2['clusters']))
assert(len(kubeconfig['contexts']) == len(kubeconfig2['contexts']))
assert(len(kubeconfig['users']) == len(kubeconfig2['users']))
assert (len(kubeconfig['clusters']) == len(kubeconfig2['clusters']))
assert (len(kubeconfig['contexts']) == len(kubeconfig2['contexts']))
assert (len(kubeconfig['users']) == len(kubeconfig2['users']))


# INPUT:
Expand All @@ -479,12 +479,12 @@ def test_create_kubeconfig_3(config_file, config_profile, oce_cluster, request):
util.validate_response(result, json_response_expected=False)

# Check that a file got created at user provided kubeconfig location
assert(os.path.isfile(config_file_path))
assert (os.path.isfile(config_file_path))
# Check if it is a valid yaml. yaml load will raise an exception in case of invalid yaml
with open(config_file_path, 'r') as f:
kubeconfig = yaml.safe_load(f)
# Check there is only ONE cluster, user and context in the downloaded kubeconfig for this test.
assert(len(kubeconfig['clusters']) == 1)
assert (len(kubeconfig['clusters']) == 1)
assert (len(kubeconfig['contexts']) == 1)
assert (len(kubeconfig['users']) == 1)

Expand Down Expand Up @@ -522,7 +522,7 @@ def test_create_kubeconfig_4(config_file, config_profile, oce_cluster, request):
with open(config_file_path, 'r') as f:
kubeconfig = yaml.safe_load(f)
# Check there is only ONE cluster, user and context in the downloaded kubeconfig for this test.
assert(len(kubeconfig['clusters']) == 1)
assert (len(kubeconfig['clusters']) == 1)
assert (len(kubeconfig['contexts']) == 1)
assert (len(kubeconfig['users']) == 1)

Expand Down Expand Up @@ -566,11 +566,11 @@ def test_create_kubeconfig_5(config_file, config_profile, oce_cluster, request):
with open(config_file_path, 'r') as f:
kubeconfig = yaml.safe_load(f)
# Check there is only ONE cluster, user and context in the downloaded kubeconfig for this test.
assert(len(kubeconfig['clusters']) == 1)
assert (len(kubeconfig['clusters']) == 1)
assert (len(kubeconfig['contexts']) == 1)
assert (len(kubeconfig['users']) == 1)
# Check that the cluster key has changed indicating we did overwrite old cluster content with new cluster content
assert(kubeconfig['clusters'] != sample_kubeconfig_yaml['clusters'])
assert (kubeconfig['clusters'] != sample_kubeconfig_yaml['clusters'])


# INPUT:
Expand All @@ -597,12 +597,12 @@ def test_create_kubeconfig_6(config_file, config_profile, oce_cluster, request):
util.validate_response(result, json_response_expected=False)

# Check that a file got created at default kubeconfig location
assert(os.path.isfile(config_file_path))
assert (os.path.isfile(config_file_path))
# Check if it is a valid yaml. yaml load will raise an exception in case of invalid yaml
with open(config_file_path, 'r') as f:
kubeconfig = yaml.safe_load(f)
# Check there is only ONE cluster, user and context in the downloaded kubeconfig for this test.
assert(len(kubeconfig['clusters']) == 1)
assert (len(kubeconfig['clusters']) == 1)
assert (len(kubeconfig['contexts']) == 1)
assert (len(kubeconfig['users']) == 1)

Expand Down
4 changes: 4 additions & 0 deletions services/costad/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# coding: utf-8
# Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
# NOTE: This class is auto generated by OracleSDKGenerator. DO NOT EDIT. API Version: 20190111
4 changes: 4 additions & 0 deletions services/costad/src/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# coding: utf-8
# Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
# NOTE: This class is auto generated by OracleSDKGenerator. DO NOT EDIT. API Version: 20190111
4 changes: 4 additions & 0 deletions services/costad/src/oci_cli_cost_ad/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# coding: utf-8
# Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
# NOTE: This class is auto generated by OracleSDKGenerator. DO NOT EDIT. API Version: 20190111
4 changes: 4 additions & 0 deletions services/costad/src/oci_cli_cost_ad/generated/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# coding: utf-8
# Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license.
# NOTE: This class is auto generated by OracleSDKGenerator. DO NOT EDIT. API Version: 20190111
Loading