Skip to content

Commit 79ac57d

Browse files
Merge remote-tracking branch 'scm/github' into release_2026-04-14
2 parents bbc0cea + bc9ff91 commit 79ac57d

223 files changed

Lines changed: 5696 additions & 370 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,21 @@ All notable changes to this project will be documented in this file.
44

55
The format is based on [Keep a Changelog](http://keepachangelog.com/)
66

7+
## 65.112.0 - 2026-04-14
8+
### Added
9+
- Support for filesystem snapshot locking for ransomware protection in the File Storage service
10+
- Support for creating refresh-able metadata clones in Autonomous Database in the Database service
11+
- Support for cross-region Data Guard for Azure, GCP, and AWS KMS-based databases in the Database MultiCloud service
12+
- Support for multicloud policies API and OMHub Resource View and Policy Hub UI features in the Multicloud service
13+
- Support for Development and Production domain group types in place of Lightweight and Standard in the OCI Internet of Things (OCI IoT) service
14+
- Support for Fusion Data Intelligence (FDI) self-service integration in the Fusion Application as a Service
15+
- Support for implementing Customer self-service feature to add egress ports in the Fusion Application as a Service
16+
- Support for a new flag to the create and update capacity reservation APIs in the Compute service
17+
- Support for alarms and notifications in the OCI Control Center service  
18+
19+
### Breaking Changes
20+
- The field `CompartmentIdInSubtree` removed from the model `ListNetworkAnchorsRequest` in the MultiCloud service
21+
722
## 65.111.0 - 2026-04-07
823
### Added
924
- Support for managing OLVM environment and endpoint fields for asset sources in the Cloud Bridge service

common/auth/federation_client_oke_workload_identity.go

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ type x509FederationClientForOkeWorkloadIdentity struct {
3131
sessionKeySupplier sessionKeySupplier
3232
securityToken securityToken
3333
authClient *common.BaseClient
34+
httpClient *http.Client
3435
mux sync.Mutex
3536
proxymuxEndpoint string
3637
saTokenProvider ServiceAccountTokenProvider
@@ -46,10 +47,29 @@ func newX509FederationClientForOkeWorkloadIdentity(endpoint string, saTokenProvi
4647
}
4748

4849
client.sessionKeySupplier = newSessionKeySupplier()
50+
client.httpClient = newOkeWorkloadIdentityHTTPClient(kubernetesServiceAccountCert)
4951

5052
return client, nil
5153
}
5254

55+
func newOkeWorkloadIdentityHTTPClient(kubernetesServiceAccountCert *x509.CertPool) *http.Client {
56+
return &http.Client{
57+
Timeout: 30 * time.Second,
58+
Transport: &http.Transport{
59+
TLSClientConfig: &tls.Config{
60+
RootCAs: kubernetesServiceAccountCert,
61+
},
62+
},
63+
}
64+
}
65+
66+
func (c *x509FederationClientForOkeWorkloadIdentity) proxymuxHTTPClient() *http.Client {
67+
if c.httpClient == nil {
68+
c.httpClient = newOkeWorkloadIdentityHTTPClient(c.kubernetesServiceAccountCert)
69+
}
70+
return c.httpClient
71+
}
72+
5373
func (c *x509FederationClientForOkeWorkloadIdentity) renewSecurityToken() (err error) {
5474
if err = c.sessionKeySupplier.Refresh(); err != nil {
5575
return fmt.Errorf("failed to refresh session key: %s", err.Error())
@@ -73,15 +93,6 @@ type token struct {
7393

7494
// getSecurityToken get security token from Proxymux
7595
func (c *x509FederationClientForOkeWorkloadIdentity) getSecurityToken() (securityToken, error) {
76-
client := http.Client{
77-
Timeout: 30 * time.Second,
78-
Transport: &http.Transport{
79-
TLSClientConfig: &tls.Config{
80-
RootCAs: c.kubernetesServiceAccountCert,
81-
},
82-
},
83-
}
84-
8596
publicKey := string(c.sessionKeySupplier.PublicKeyPemRaw())
8697
common.Logf("Public Key for OKE Workload Identity is:", publicKey)
8798
rawPayload := workloadIdentityRequestPayload{Podkey: publicKey}
@@ -110,7 +121,7 @@ func (c *x509FederationClientForOkeWorkloadIdentity) getSecurityToken() (securit
110121
opcRequestID := utils.GenerateOpcRequestID()
111122
request.Header.Set("opc-request-id", opcRequestID)
112123

113-
response, err := client.Do(request)
124+
response, err := c.proxymuxHTTPClient().Do(request)
114125
if err != nil {
115126
return nil, fmt.Errorf("error %s", err)
116127
}
@@ -123,6 +134,11 @@ func (c *x509FederationClientForOkeWorkloadIdentity) getSecurityToken() (securit
123134
}
124135
}(response.Body)
125136

137+
// Ensure body is read before returning, to allow connection reuse.
138+
if _, err = body.ReadFrom(response.Body); err != nil {
139+
return nil, fmt.Errorf("error reading Workload Identity token generation response: %s. Please contact OKE team", err)
140+
}
141+
126142
statusCode := response.StatusCode
127143
if statusCode != http.StatusOK {
128144
if statusCode == http.StatusForbidden {
@@ -135,10 +151,6 @@ func (c *x509FederationClientForOkeWorkloadIdentity) getSecurityToken() (securit
135151

136152
}
137153

138-
if _, err = body.ReadFrom(response.Body); err != nil {
139-
return nil, fmt.Errorf("error reading Workload Identity token generation response: %s. Please contact OKE team", err)
140-
}
141-
142154
rawBody := body.String()
143155
rawBody = rawBody[1 : len(rawBody)-1]
144156
decodedBodyStr, err := base64.StdEncoding.DecodeString(rawBody)

common/auth/federation_client_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"bytes"
88
"crypto/rsa"
99
"crypto/x509"
10+
"encoding/base64"
11+
"encoding/json"
1012
"encoding/pem"
1113
"fmt"
1214
"net/http"
@@ -453,6 +455,41 @@ func TestX509FederationClient_ClientHost(t *testing.T) {
453455
}
454456
}
455457

458+
func TestX509FederationClientForOkeWorkloadIdentity_ReusesHTTPClient(t *testing.T) {
459+
proxymuxServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
460+
encodedToken, err := json.Marshal(token{Token: "ST$" + expectedSecurityToken})
461+
assert.NoError(t, err)
462+
fmt.Fprintf(w, "%q", base64.StdEncoding.EncodeToString(encodedToken))
463+
}))
464+
defer proxymuxServer.Close()
465+
466+
federationClient, err := newX509FederationClientForOkeWorkloadIdentity(proxymuxServer.URL, &fakeSaTokenProvider{}, nil)
467+
assert.NoError(t, err)
468+
469+
okeFederationClient, ok := federationClient.(*x509FederationClientForOkeWorkloadIdentity)
470+
if !assert.True(t, ok) {
471+
return
472+
}
473+
474+
okeFederationClient.httpClient = proxymuxServer.Client()
475+
476+
mockSessionKeySupplier := new(mockSessionKeySupplier)
477+
mockSessionKeySupplier.On("PublicKeyPemRaw").Return([]byte(sessionPublicKeyPem)).Twice()
478+
okeFederationClient.sessionKeySupplier = mockSessionKeySupplier
479+
480+
sharedClient := okeFederationClient.httpClient
481+
482+
_, err = okeFederationClient.getSecurityToken()
483+
assert.NoError(t, err)
484+
assert.Same(t, sharedClient, okeFederationClient.httpClient)
485+
486+
_, err = okeFederationClient.getSecurityToken()
487+
assert.NoError(t, err)
488+
assert.Same(t, sharedClient, okeFederationClient.httpClient)
489+
490+
mockSessionKeySupplier.AssertExpectations(t)
491+
}
492+
456493
func TestFederationAuthClientCircuitBreaker(t *testing.T) {
457494
t.Setenv("OCI_SDK_AUTH_CLIENT_CIRCUIT_BREAKER_ENABLED", "True")
458495
federationClient := &x509FederationClient{}

common/retry.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,20 @@ var GlobalRetry *RetryPolicy = nil
185185
// RetryPolicyOption is the type of the options for NewRetryPolicy.
186186
type RetryPolicyOption func(rp *RetryPolicy)
187187

188-
// String Converts retry policy to human-readable string representation
189-
func (rp RetryPolicy) String() string {
188+
// String converts retry policy to human-readable string representation
189+
// Safe to call on a nil *RetryPolicy
190+
func (rp *RetryPolicy) String() string {
191+
if rp == nil {
192+
return "<nil>"
193+
}
194+
195+
nonECPolicy := "<nil>"
196+
if rp.NonEventuallyConsistentPolicy != nil {
197+
nonECPolicy = rp.NonEventuallyConsistentPolicy.String()
198+
}
199+
190200
return fmt.Sprintf("{MaximumNumberAttempts=%v, MinSleepBetween=%v, MaxSleepBetween=%v, ExponentialBackoffBase=%v, NonEventuallyConsistentPolicy=%v}",
191-
rp.MaximumNumberAttempts, rp.MinSleepBetween, rp.MaxSleepBetween, rp.ExponentialBackoffBase, rp.NonEventuallyConsistentPolicy)
201+
rp.MaximumNumberAttempts, rp.MinSleepBetween, rp.MaxSleepBetween, rp.ExponentialBackoffBase, nonECPolicy)
192202
}
193203

194204
// Validate returns true if the RetryPolicy is valid; if not, it also returns an error.

common/retry_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,29 @@ func TestDefaultRetryPolicy(t *testing.T) {
286286
}
287287
}
288288

289+
func TestRetryPolicyString_NilPointerDoesNotPanic(t *testing.T) {
290+
var policy *RetryPolicy = nil
291+
292+
assert.Equal(t, "<nil>", policy.String())
293+
}
294+
295+
func TestRetryPolicyString_NilNonECPolicyDoesNotPanic(t *testing.T) {
296+
policy := DefaultRetryPolicyWithoutEventualConsistency()
297+
policyString := policy.String()
298+
299+
assert.Contains(t, policyString, "MaximumNumberAttempts=8")
300+
assert.Contains(t, policyString, "MinSleepBetween=0")
301+
assert.Contains(t, policyString, "MaxSleepBetween=30")
302+
assert.Contains(t, policyString, "ExponentialBackoffBase=2")
303+
assert.Contains(t, policyString, "NonEventuallyConsistentPolicy=<nil>")
304+
}
305+
306+
func TestRetryPolicyString_WithNonECPolicy(t *testing.T) {
307+
policy := DefaultRetryPolicy()
308+
309+
assert.Contains(t, policy.String(), "NonEventuallyConsistentPolicy={MaximumNumberAttempts=")
310+
}
311+
289312
func TestRetryEOF(t *testing.T) {
290313
policy := DefaultRetryPolicy()
291314
// unroll an exponential retry policy with a specified maximum

common/version.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/instance_reservation_shape_config_details.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ type InstanceReservationShapeConfigDetails struct {
3636

3737
// The total amount of memory available to the instance, in gigabytes.
3838
MemoryInGBs *float32 `mandatory:"false" json:"memoryInGBs"`
39+
40+
// This field is reserved for internal use.
41+
ResourceManagement InstanceReservationShapeConfigDetailsResourceManagementEnum `mandatory:"false" json:"resourceManagement,omitempty"`
3942
}
4043

4144
func (m InstanceReservationShapeConfigDetails) String() string {
@@ -48,8 +51,53 @@ func (m InstanceReservationShapeConfigDetails) String() string {
4851
func (m InstanceReservationShapeConfigDetails) ValidateEnumValue() (bool, error) {
4952
errMessage := []string{}
5053

54+
if _, ok := GetMappingInstanceReservationShapeConfigDetailsResourceManagementEnum(string(m.ResourceManagement)); !ok && m.ResourceManagement != "" {
55+
errMessage = append(errMessage, fmt.Sprintf("unsupported enum value for ResourceManagement: %s. Supported values are: %s.", m.ResourceManagement, strings.Join(GetInstanceReservationShapeConfigDetailsResourceManagementEnumStringValues(), ",")))
56+
}
5157
if len(errMessage) > 0 {
5258
return true, fmt.Errorf("%s", strings.Join(errMessage, "\n"))
5359
}
5460
return false, nil
5561
}
62+
63+
// InstanceReservationShapeConfigDetailsResourceManagementEnum Enum with underlying type: string
64+
type InstanceReservationShapeConfigDetailsResourceManagementEnum string
65+
66+
// Set of constants representing the allowable values for InstanceReservationShapeConfigDetailsResourceManagementEnum
67+
const (
68+
InstanceReservationShapeConfigDetailsResourceManagementDynamic InstanceReservationShapeConfigDetailsResourceManagementEnum = "DYNAMIC"
69+
InstanceReservationShapeConfigDetailsResourceManagementStatic InstanceReservationShapeConfigDetailsResourceManagementEnum = "STATIC"
70+
)
71+
72+
var mappingInstanceReservationShapeConfigDetailsResourceManagementEnum = map[string]InstanceReservationShapeConfigDetailsResourceManagementEnum{
73+
"DYNAMIC": InstanceReservationShapeConfigDetailsResourceManagementDynamic,
74+
"STATIC": InstanceReservationShapeConfigDetailsResourceManagementStatic,
75+
}
76+
77+
var mappingInstanceReservationShapeConfigDetailsResourceManagementEnumLowerCase = map[string]InstanceReservationShapeConfigDetailsResourceManagementEnum{
78+
"dynamic": InstanceReservationShapeConfigDetailsResourceManagementDynamic,
79+
"static": InstanceReservationShapeConfigDetailsResourceManagementStatic,
80+
}
81+
82+
// GetInstanceReservationShapeConfigDetailsResourceManagementEnumValues Enumerates the set of values for InstanceReservationShapeConfigDetailsResourceManagementEnum
83+
func GetInstanceReservationShapeConfigDetailsResourceManagementEnumValues() []InstanceReservationShapeConfigDetailsResourceManagementEnum {
84+
values := make([]InstanceReservationShapeConfigDetailsResourceManagementEnum, 0)
85+
for _, v := range mappingInstanceReservationShapeConfigDetailsResourceManagementEnum {
86+
values = append(values, v)
87+
}
88+
return values
89+
}
90+
91+
// GetInstanceReservationShapeConfigDetailsResourceManagementEnumStringValues Enumerates the set of values in String for InstanceReservationShapeConfigDetailsResourceManagementEnum
92+
func GetInstanceReservationShapeConfigDetailsResourceManagementEnumStringValues() []string {
93+
return []string{
94+
"DYNAMIC",
95+
"STATIC",
96+
}
97+
}
98+
99+
// GetMappingInstanceReservationShapeConfigDetailsResourceManagementEnum performs case Insensitive comparison on enum value and return the desired enum
100+
func GetMappingInstanceReservationShapeConfigDetailsResourceManagementEnum(val string) (InstanceReservationShapeConfigDetailsResourceManagementEnum, bool) {
101+
enum, ok := mappingInstanceReservationShapeConfigDetailsResourceManagementEnumLowerCase[strings.ToLower(val)]
102+
return enum, ok
103+
}

database/autonomous_database_connection_urls.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ type AutonomousDatabaseConnectionUrls struct {
4242

4343
// The URL of the Database Transforms for the Autonomous AI Database.
4444
DatabaseTransformsUrl *string `mandatory:"false" json:"databaseTransformsUrl"`
45+
46+
// The URL of the Spatial Studio for the Autonomous AI Database.
47+
SpatialStudioUrl *string `mandatory:"false" json:"spatialStudioUrl"`
4548
}
4649

4750
func (m AutonomousDatabaseConnectionUrls) String() string {

database/database_tool.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ const (
6262
DatabaseToolNameDataTransforms DatabaseToolNameEnum = "DATA_TRANSFORMS"
6363
DatabaseToolNameOrds DatabaseToolNameEnum = "ORDS"
6464
DatabaseToolNameMongodbApi DatabaseToolNameEnum = "MONGODB_API"
65+
DatabaseToolNameSpatialStudio DatabaseToolNameEnum = "SPATIAL_STUDIO"
6566
)
6667

6768
var mappingDatabaseToolNameEnum = map[string]DatabaseToolNameEnum{
@@ -72,6 +73,7 @@ var mappingDatabaseToolNameEnum = map[string]DatabaseToolNameEnum{
7273
"DATA_TRANSFORMS": DatabaseToolNameDataTransforms,
7374
"ORDS": DatabaseToolNameOrds,
7475
"MONGODB_API": DatabaseToolNameMongodbApi,
76+
"SPATIAL_STUDIO": DatabaseToolNameSpatialStudio,
7577
}
7678

7779
var mappingDatabaseToolNameEnumLowerCase = map[string]DatabaseToolNameEnum{
@@ -82,6 +84,7 @@ var mappingDatabaseToolNameEnumLowerCase = map[string]DatabaseToolNameEnum{
8284
"data_transforms": DatabaseToolNameDataTransforms,
8385
"ords": DatabaseToolNameOrds,
8486
"mongodb_api": DatabaseToolNameMongodbApi,
87+
"spatial_studio": DatabaseToolNameSpatialStudio,
8588
}
8689

8790
// GetDatabaseToolNameEnumValues Enumerates the set of values for DatabaseToolNameEnum
@@ -103,6 +106,7 @@ func GetDatabaseToolNameEnumStringValues() []string {
103106
"DATA_TRANSFORMS",
104107
"ORDS",
105108
"MONGODB_API",
109+
"SPATIAL_STUDIO",
106110
}
107111
}
108112

dbmulticloud/action_type.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
// <br>
2727
// <b>AWS</b>:<br>
2828
// <b>Oracle AWS Connector Resource:</b>&nbsp;&nbsp;The Oracle AWS Connector Resource is used to install the AWS Identity Connector on an Exadata VM cluster in Oracle Exadata Database Service on Dedicated Infrastructure (ExaDB-D).
29-
// <b>Google AWS Key Resource:</b>&nbsp;&nbsp;The Oracle AWS Key Resource is used to register and manage a AWS Key within Oracle Cloud Infrastructure (OCI).
29+
// <b>Oracle AWS Key Resource:</b>&nbsp;&nbsp;The Oracle AWS Key Resource is used to register and manage a AWS Key within Oracle Cloud Infrastructure (OCI).
3030
//
3131

3232
package dbmulticloud

0 commit comments

Comments
 (0)