Skip to content
This repository was archived by the owner on Nov 2, 2023. It is now read-only.

Commit d5e0040

Browse files
New Release v1.2.1 for OCI Service Broker
- Minor Update to use unified API for ATP/ADW service. Internal change with no customer impact Co-authored-by: Ashokkumar Kannan ashokkumar.kannan@oracle.com Co-authored-by: Jayasheelan Kumar jayasheelan.kumar@oracle.com Co-authored-by: Naman Mehta naman.mehta@oracle.com
1 parent 097a944 commit d5e0040

16 files changed

+364
-673
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,19 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
66
This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
77

8+
[1.2.1]
9+
10+
- Minor Update to use unified API for ATP/ADW service. Internal change with no customer impact
11+
12+
[1.2.0]
13+
14+
- Adding Support to Bind Existing Service Instance for all supported services
15+
- Adding Diagnostic Tool to help identify the common issues during installation
16+
- Minor Document Fixes
17+
818
[1.1.1]
919

20+
- Adding support for Seoul (ICN) region
1021
- Minor Document Fixes
1122
- Bug Fixes
1223

charts/oci-service-broker/Chart.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
apiVersion: v1
66
description: A Helm chart for installing OCI Service Broker into a Kubernetes cluster
77
name: oci-service-broker
8-
version: 1.2.0
8+
version: 1.2.1

charts/oci-service-broker/docs/installation.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ brew update && brew install kubernetes-service-catalog-client
6969
The OCI Service Broker is packaged as Helm chart for making it easy to install in Kubernetes. The chart is available at [charts/oci-service-broker](../) directory.
7070

7171
```plain
72-
https://github.com/oracle/oci-service-broker/releases/download/v1.2.0/oci-service-broker-1.2.0.tgz
72+
https://github.com/oracle/oci-service-broker/releases/download/v1.2.0/oci-service-broker-1.2.1.tgz
7373
```
7474

7575
### OCI credentials

charts/oci-service-broker/values.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ image:
1414
repository: iad.ocir.io/oracle/oci-service-broker
1515

1616
# Tag of the image
17-
tag: 1.2.0
17+
tag: 1.2.1
1818

1919
# The image pull policy
2020
pullPolicy: Always

oci-service-broker/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ apply plugin: 'maven-publish'
3030
archivesBaseName = 'oci-service-broker'
3131

3232
// Sometimes, the version has to be overridden from command line
33-
version = project.hasProperty('version_num') ? project.getProperty('version_num') : '1.2.0'
33+
version = project.hasProperty('version_num') ? project.getProperty('version_num') : '1.2.1'
3434
ext.dockerGroup = 'iad.ocir.io/oci-cnp-dev'
3535
mainClassName = 'com.oracle.oci.osb.Broker'
3636

oci-service-broker/src/main/java/com/oracle/oci/osb/adapters/adb/AutonomousDatabaseAdapter.java

Lines changed: 69 additions & 71 deletions
Large diffs are not rendered by default.

oci-service-broker/src/main/java/com/oracle/oci/osb/adapters/adb/AutonomousDatabaseInstance.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
*/
1313
public class AutonomousDatabaseInstance {
1414
private String id;
15-
private TYPE type;
15+
private AutonomousDatabaseAdapter.DBWorkloadType dbWorkloadType;
1616
private String displayName;
1717
private int cpuCoreCount;
1818
private int storageSizeInGBs;
@@ -30,10 +30,10 @@ public enum TYPE {
3030
}
3131

3232

33-
public AutonomousDatabaseInstance(String id, TYPE type, String displayName, int cpuCoreCount, int
33+
public AutonomousDatabaseInstance(String id, AutonomousDatabaseAdapter.DBWorkloadType dbWorkloadType, String displayName, int cpuCoreCount, int
3434
storageSizeInGBs, String dbName, AutonomousDatabaseAdapter.LicenseModel licenseModel, Map<String, String> freeformTags, LifecycleState lifecycleState) {
3535
this.id = id;
36-
this.type = type;
36+
this.dbWorkloadType = dbWorkloadType;
3737
this.displayName = displayName;
3838
this.cpuCoreCount = cpuCoreCount;
3939
this.storageSizeInGBs = storageSizeInGBs;
@@ -56,8 +56,8 @@ public String getId() {
5656
return id;
5757
}
5858

59-
public TYPE getType() {
60-
return type;
59+
public AutonomousDatabaseAdapter.DBWorkloadType getDbWorkloadType() {
60+
return dbWorkloadType;
6161
}
6262

6363
public String getDbName() {

oci-service-broker/src/main/java/com/oracle/oci/osb/adapters/adb/AutonomousDatabaseOCIClient.java

Lines changed: 269 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,283 @@
55

66
package com.oracle.oci.osb.adapters.adb;
77

8+
import com.oracle.bmc.Region;
9+
import com.oracle.bmc.auth.AuthenticationDetailsProvider;
10+
import com.oracle.bmc.database.DatabaseClient;
11+
import com.oracle.bmc.database.model.*;
12+
import com.oracle.bmc.database.requests.*;
13+
import com.oracle.bmc.database.responses.*;
14+
import com.oracle.oci.osb.util.Constants;
15+
import com.oracle.oci.osb.util.RequestUtil;
16+
import com.oracle.oci.osb.util.Utils;
17+
818
import java.io.IOException;
19+
import java.util.ArrayList;
920
import java.util.List;
1021
import java.util.Map;
22+
import java.util.logging.Level;
23+
import java.util.logging.Logger;
24+
25+
import static com.oracle.oci.osb.util.Utils.debugLog;
26+
import static com.oracle.oci.osb.util.Utils.getLogger;
27+
28+
public class AutonomousDatabaseOCIClient implements AutoCloseable{
29+
30+
private static final Logger LOGGER = getLogger(AutonomousDatabaseOCIClient.class);
31+
32+
private DatabaseClient ociDBClient;
33+
34+
private String compartmentId;
35+
36+
AutonomousDatabaseOCIClient(AuthenticationDetailsProvider authProvider, String compartmentId) {
37+
this(authProvider, compartmentId, Region.fromRegionId(System.getProperty(Constants.REGION_ID)));
38+
}
39+
40+
private AutonomousDatabaseOCIClient(AuthenticationDetailsProvider authProvider, String compartmentId, Region regionId) {
41+
this.compartmentId = compartmentId;
42+
ociDBClient = new DatabaseClient(authProvider);
43+
ociDBClient.setRegion(regionId);
44+
}
45+
46+
/**
47+
* Create an AD instance. The instance will be provisioned asynchronously
48+
*
49+
* @param displayName display name(mostly for console)
50+
* @param dbName name of the database.
51+
* @param type DBWorkload Type of the Database. OLTP or DW.
52+
* @param cpuCount number of cpu cores required.
53+
* @param StorageSize required storage size for DB in Terabytes.
54+
* @param tags freeform tags.
55+
* @param password password to be set for the DB admin user.
56+
* @return AutonomousDatabase
57+
*/
58+
public AutonomousDatabaseInstance create(String displayName, String dbName, CreateAutonomousDatabaseBase.DbWorkload type,
59+
int cpuCount, int StorageSize, Map<String, String> tags,
60+
Map<String, Map<String, Object>> definedTags, String password,
61+
boolean licenseIncluded) {
62+
CreateAutonomousDatabaseDetails request = CreateAutonomousDatabaseDetails.builder()
63+
.adminPassword(password)
64+
.compartmentId(compartmentId)
65+
.cpuCoreCount(cpuCount)
66+
.dbWorkload(type)
67+
.dataStorageSizeInTBs(StorageSize)
68+
.dbName(dbName)
69+
.displayName(displayName)
70+
.freeformTags(tags)
71+
.definedTags(definedTags)
72+
.licenseModel(licenseIncluded ? CreateAutonomousDatabaseDetails
73+
.LicenseModel.LicenseIncluded : CreateAutonomousDatabaseDetails.LicenseModel
74+
.BringYourOwnLicense)
75+
.build();
76+
CreateAutonomousDatabaseResponse response = ociDBClient.createAutonomousDatabase
77+
(CreateAutonomousDatabaseRequest.builder().createAutonomousDatabaseDetails(request).build());
78+
79+
return buildADInstance(response.getAutonomousDatabase());
80+
}
81+
82+
/**
83+
* Update an AD Instance. Update will be done asynchronously. If the param
84+
* values are empty or if they already match the existing value then update
85+
* is skipped for those values. If none of the params have any change then
86+
* this simply returns without doing any update.
87+
*
88+
* @param adOCID OCID of the AD instance to be updated.
89+
* @param displayName new display name.
90+
* @param cpuCount new number of CPU core.
91+
* @param StorageSize new DB storage size in Terabytes.
92+
* @param tags new freeform tags.
93+
* @return AutonomousDatabase
94+
*/
95+
public AutonomousDatabaseInstance update(String adOCID, String displayName, int cpuCount, int StorageSize,
96+
Map<String, String> tags, Map<String, Map<String, Object>> definedTags) {
97+
AutonomousDatabase ad = getADInstance(adOCID);
98+
UpdateAutonomousDatabaseDetails.Builder reqBuilder = UpdateAutonomousDatabaseDetails.builder();
99+
100+
//Check if update required
101+
boolean updateRequired = false;
102+
if (!Utils.isNullOrEmptyString(displayName) && !ad.getDisplayName().equals(displayName)) {
103+
reqBuilder = reqBuilder.displayName(displayName);
104+
debugLog(LOGGER, "DisplayName to be updated.from:%s;to:%s", Level.FINE, ad.getDisplayName(), displayName);
105+
updateRequired = true;
106+
}
107+
if (cpuCount > 0 && ad.getCpuCoreCount() != cpuCount) {
108+
reqBuilder = reqBuilder.cpuCoreCount(cpuCount);
109+
debugLog(LOGGER, "CpuCoreCount to be updated.from:%s;to:%s", Level.FINE, ad.getCpuCoreCount()
110+
.toString(), Integer.toString(cpuCount));
111+
updateRequired = true;
112+
}
113+
if (StorageSize > 0 && ad.getDataStorageSizeInTBs() != StorageSize) {
114+
reqBuilder = reqBuilder.dataStorageSizeInTBs(StorageSize);
115+
debugLog(LOGGER, "StorageSize to be updated.from:%s;to:%s", Level.FINE, ad.getDataStorageSizeInTBs()
116+
.toString(), Integer.toString(StorageSize));
117+
updateRequired = true;
118+
}
119+
if (tags != null && tags.entrySet().size() > 0 && !tags.equals(ad.getFreeformTags())) {
120+
reqBuilder = reqBuilder.freeformTags(tags);
121+
debugLog(LOGGER, "tags to be updated.from:%s;to:%s", Level.FINE, ad.getFreeformTags(), tags);
122+
updateRequired = true;
123+
}
124+
if (definedTags != null && definedTags.entrySet().size() > 0 && !definedTags.equals(ad.getDefinedTags())) {
125+
reqBuilder = reqBuilder.definedTags(definedTags);
126+
debugLog(LOGGER, "Defined tags to be updated.from:%s;to:%s", Level.FINE, ad.getDefinedTags(), definedTags);
127+
updateRequired = true;
128+
}
129+
if (!updateRequired) {
130+
throw new AutonomousDatabaseAdapter.UpdateNotRequiredException();
131+
}
132+
133+
UpdateAutonomousDatabaseDetails request = reqBuilder.build();
134+
UpdateAutonomousDatabaseResponse response = ociDBClient.updateAutonomousDatabase
135+
(UpdateAutonomousDatabaseRequest.builder().autonomousDatabaseId(adOCID)
136+
.updateAutonomousDatabaseDetails(request).build());
137+
return buildADInstance(response.getAutonomousDatabase());
138+
}
139+
140+
/**
141+
* Get details of an AD instance.
142+
* @param adOCID OCID of the AD instance to be updated.
143+
* @return AutonomousDatabase
144+
*/
145+
public AutonomousDatabaseInstance get(String adOCID) {
146+
return buildADInstance(getADInstance(adOCID));
147+
}
148+
149+
/**
150+
* Delete an AD instance. The operation will be asynchronously.
151+
*
152+
* @param adOCID OCID of the AD instance to be deleted.
153+
*/
154+
public void delete(String adOCID) {
155+
DeleteAutonomousDatabaseRequest request = DeleteAutonomousDatabaseRequest.builder().autonomousDatabaseId
156+
(adOCID).build();
157+
ociDBClient.deleteAutonomousDatabase(request);
158+
}
159+
160+
/**
161+
* Update DB ADMIN password.
162+
*
163+
* @param password new DB ADMIN password.
164+
* @return AutonomousDatabase
165+
*/
166+
public AutonomousDatabaseInstance changePassword(String password) {
167+
UpdateAutonomousDatabaseDetails request = UpdateAutonomousDatabaseDetails.builder().adminPassword(password)
168+
.build();
169+
UpdateAutonomousDatabaseResponse response = ociDBClient.updateAutonomousDatabase
170+
(UpdateAutonomousDatabaseRequest.builder().updateAutonomousDatabaseDetails(request).build());
171+
return buildADInstance(response.getAutonomousDatabase());
172+
}
173+
174+
/**
175+
* Download the credential/configuration files for connecting to an AD
176+
* instance. The files are base64 encoded and converted as strings.
177+
*
178+
* @param adID OCID of the AD instance.
179+
* @param dbName name of the database.
180+
* @param wPassword password to set for the Oracle wallet that is
181+
* created for this request.
182+
* @return Map with filename/attribute name as keys and filename/attribute
183+
* base64 encoded contents as values.
184+
* @throws IOException if downloading credential zip file fails.
185+
*/
186+
public Map<String, String> getCredentials(String adID, String dbName, String wPassword) throws IOException {
187+
GenerateAutonomousDatabaseWalletDetails adbWalletDetails = GenerateAutonomousDatabaseWalletDetails.builder()
188+
.password(wPassword).build();
189+
GenerateAutonomousDatabaseWalletResponse adbWalletResponse = ociDBClient.generateAutonomousDatabaseWallet(
190+
GenerateAutonomousDatabaseWalletRequest.builder()
191+
.generateAutonomousDatabaseWalletDetails(adbWalletDetails)
192+
.autonomousDatabaseId(adID)
193+
.build());
194+
return ADBUtils.generateCredentialsMap(dbName, adbWalletResponse.getInputStream());
195+
}
196+
197+
/**
198+
* Fetch the list of all AD with a specific display name in a given OCI
199+
* compartment.
200+
*
201+
* @param compartmentId OCID of the Compartment.
202+
* @param displayName display name to filter the AD instances.
203+
* @return List of ADB instance details.
204+
*/
205+
public List<AutonomousDatabaseInstance> listInstances(String compartmentId, String displayName) {
206+
ListAutonomousDatabasesRequest.Builder reqBuilder = ListAutonomousDatabasesRequest.builder().compartmentId
207+
(compartmentId);
208+
if (displayName != null && !displayName.isEmpty()) {
209+
reqBuilder.displayName(displayName);
210+
}
211+
ListAutonomousDatabasesRequest request = reqBuilder.build();
212+
ListAutonomousDatabasesResponse response = ociDBClient.listAutonomousDatabases(request);
213+
List<AutonomousDatabaseInstance> autonomousDatabaseInstanceList = new ArrayList<>();
214+
response.getItems().forEach((adwSummary) -> autonomousDatabaseInstanceList.add(buildADInstance(adwSummary)));
215+
216+
return autonomousDatabaseInstanceList;
217+
}
11218

12-
public interface AutonomousDatabaseOCIClient extends AutoCloseable {
13-
AutonomousDatabaseInstance create(String displayName, String dbName, int cpuCount, int StorageSize, Map<String,
14-
String> tags, Map<String, Map<String, Object>> definedTags, String password, boolean licenseIncluded);
219+
public void close() {
220+
ociDBClient.close();
221+
}
15222

16-
AutonomousDatabaseInstance update(String instanceOCID, String displayName, int cpuCount, int StorageSize,
17-
Map<String, String> tags, Map<String, Map<String, Object>> definedTags);
223+
private AutonomousDatabase getADInstance(String adOCID) {
224+
GetAutonomousDatabaseRequest request = GetAutonomousDatabaseRequest.builder().autonomousDatabaseId(adOCID)
225+
.build();
226+
GetAutonomousDatabaseResponse response = ociDBClient.getAutonomousDatabase(request);
227+
return response.getAutonomousDatabase();
228+
}
18229

19-
AutonomousDatabaseInstance get(String instanceOCID);
230+
private AutonomousDatabaseInstance buildADInstance(AutonomousDatabaseSummary summary) {
231+
if (summary == null) {
232+
return null;
233+
} else {
234+
return new AutonomousDatabaseInstance(summary.getId(),
235+
getDBWorkloadType(summary.getDbWorkload().getValue()),
236+
summary.getDisplayName(),
237+
summary.getCpuCoreCount(),
238+
summary.getDataStorageSizeInTBs(),
239+
summary.getDbName(),
240+
getADBLicenseType(summary.getLicenseModel()),
241+
summary.getFreeformTags(),
242+
AutonomousDatabaseInstance.lifecycleState(summary.getLifecycleState().getValue()));
243+
}
244+
}
20245

21-
void delete(String instanceOCID);
246+
private AutonomousDatabaseInstance buildADInstance(AutonomousDatabase adbInstance) {
247+
if (adbInstance == null) {
248+
return null;
249+
} else {
250+
return new AutonomousDatabaseInstance(adbInstance.getId(),
251+
getDBWorkloadType(adbInstance.getDbWorkload().getValue()),
252+
adbInstance.getDisplayName(),
253+
adbInstance.getCpuCoreCount(),
254+
adbInstance.getDataStorageSizeInTBs(),
255+
adbInstance.getDbName(),
256+
getADBLicenseType(adbInstance.getLicenseModel()),
257+
adbInstance.getFreeformTags(),
258+
AutonomousDatabaseInstance.lifecycleState(adbInstance.getLifecycleState().getValue()));
259+
}
260+
}
22261

23-
void close();
262+
private AutonomousDatabaseAdapter.DBWorkloadType getDBWorkloadType (String dbWorkloadType) {
263+
if (dbWorkloadType.equalsIgnoreCase(AutonomousDatabase.DbWorkload.Oltp.getValue())) {
264+
return AutonomousDatabaseAdapter.DBWorkloadType.ATP;
265+
} else {
266+
return AutonomousDatabaseAdapter.DBWorkloadType.ADW;
267+
}
268+
}
24269

25-
Map<String, String> getCredentials(String atpId, String dbName, String wPassword) throws IOException;
270+
private AutonomousDatabaseAdapter.LicenseModel getADBLicenseType(AutonomousDatabaseSummary.LicenseModel
271+
sdkLicenseModel){
272+
switch (sdkLicenseModel) {
273+
case BringYourOwnLicense: return AutonomousDatabaseAdapter.LicenseModel.BYOL;
274+
case LicenseIncluded: return AutonomousDatabaseAdapter.LicenseModel.NEW;
275+
default: return AutonomousDatabaseAdapter.LicenseModel.UNKNOWN;
276+
}
277+
}
26278

27-
List<AutonomousDatabaseInstance> listInstances(String compartmentId, String displayName);
279+
private AutonomousDatabaseAdapter.LicenseModel getADBLicenseType(AutonomousDatabase.LicenseModel
280+
adwLicenseModel){
281+
switch (adwLicenseModel) {
282+
case BringYourOwnLicense: return AutonomousDatabaseAdapter.LicenseModel.BYOL;
283+
case LicenseIncluded: return AutonomousDatabaseAdapter.LicenseModel.NEW;
284+
default: return AutonomousDatabaseAdapter.LicenseModel.UNKNOWN;
285+
}
286+
}
28287
}

oci-service-broker/src/main/java/com/oracle/oci/osb/adapters/adb/adw/ADWServiceAdapter.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,9 @@
1717
*/
1818
public class ADWServiceAdapter extends AutonomousDatabaseAdapter {
1919

20-
@Override
21-
protected AutonomousDatabaseOCIClient getOCIClient(AuthenticationDetailsProvider authProvider, String
22-
compartmentId) {
23-
return new ADWServiceOCIClient(authProvider, compartmentId);
24-
}
25-
2620
@Override
2721
protected String getInstanceTypeString() {
28-
return AutonomousDatabaseInstance.TYPE.ADW.name();
22+
return AutonomousDatabaseAdapter.DBWorkloadType.ADW.name();
2923
}
3024

3125
@Override

0 commit comments

Comments
 (0)