In the previous post I've setup all the environment to be able to easily control the OCI services without bothering with the sign-in headers, and without installing anything. In this post I'll used the oci-curl() function to stop all my Autonomous Database services. In the previous post, I've set the environment variables for the private and public key, and the user, tenant and compartment OCIDs. I'm adding two variables to identify the endpoint I'll use (US-Ashburn-1 here) and the version of the REST API (20160918 here) which are both part of the URL.
Here are all my environment variables. If you set them to your values, you should be able to use the same commands as mine:
privateKeyPath=~/.oci/oci_api_key.pem keyFingerprint="05:56:ee:89:19:e7:16:03:9b:00:c3:91:cf:a6:9d:e9" authUserId=ocid1.user.oc1..aaaaaaaaflzrbfegsz2dynqh7nsea2bxm5dzcevjsykxdn45msiso5efhlla tenancyId=ocid1.tenancy.oc1..aaaaaaaac6guna6l6lpy2s6cm3kguijf4ivkgy5m4c4cngczztunig6do26q compartmentId=ocid1.tenancy.oc1..aaaaaaaac6guna6l6lpy2s6cm3kguijf4ivkgy5m4c4cngczztunig6do26q endpoint=database.us-ashburn-1.oraclecloud.com apiVersion=20160918
Here is how I use the OCI documentation sample to define the oci-curl() function in my current shell directly from the web documentation:
source <( \ curl https://docs.cloud.oracle.com/iaas/Content/Resources/Assets/signing_sample_bash.txt \ | grep -vE "(local tenancyId|local authUserId=|local keyFingerprint|local privateKeyPath=)" \ | sed -e '1s/^.*#/#/' )
List the services
I can now list my Autonomous Databases, ADW and ATP, with:
for service in autonomousDatabases autonomousDataWarehouses do oci-curl $endpoint get "/$apiVersion/$service?compartmentId=$compartmentId" | jq -r '.[] | [ .dbName , .lifecycleState , .id ] | @tsv'; done
I've projected the name, state, and OCID with JQ and used @tsv formatting here to get tabs between the columns for a nice formatting. The result is:
ATP AVAILABLE ocid1.autonomousdatabase.oc1.iad.abuwcljtthygmwsbbsr2e3ve5kwrtvyevpbr6sgmrocepqa6wtr2yx73xtoq ADWC AVAILABLE ocid1.autonomousdwdatabase.oc1.iad.abuwcljrbwuhg2iyzshauzvsjuxuqnd7wcg35xezlmxmtoitqhpw3hfqij3a
You need to remember that /autonomousdwdatabase
is for the ADW service and the /autonomousdatabase
for ATP. You know that, with Oracle products, the commercial names are often decided after the implementation, and then the API names may not match the common name. But don't worry, all this is documented:
- https://docs.cloud.oracle.com/iaas/api/#/en/database/20160918/AutonomousDataWarehouse/ListAutonomousDataWarehouses
- https://docs.cloud.oracle.com/iaas/api/#/en/database/20160918/AutonomousDatabase/ListAutonomousDatabases
Stop the services
The state "AVAILABLE" means that the service is started (which is the OPEN state for the PDB, as those services are PDBaaS). We can filter on them with JQ select(.lifecycleState=="AVAILABLE")
and then call the "stop" API with a POST request:
for service in autonomousDatabases autonomousDataWarehouses do for id in $( oci-curl $endpoint get "/$apiVersion/$service?compartmentId=$compartmentId" \ | jq -r '.[] | select(.lifecycleState=="AVAILABLE")|.id' ) ; do oci-curl $endpoint post /dev/stdin "/$apiVersion/$service/$id/actions/stop" <<<"{}" | jq -r '.dbName + ": " + .lifecycleState' done done
This gets the OCID (.id
) for all services that are in the AVAILABLE state and calls the /$id/actions/stop
method for each of them. The POST method requires a file and I just pass an empty JSON here, mentioning /dev/stdin and sending "{}" through a here string in bash. The stop query returns the service information and I use JQ to display the name and the status:
ATP: STOPPING ADWC: STOPPING
After a few seconds, running the command above to list services and status with tabs, I can see that they are in the STOPPED state:
ATP STOPPED ocid1.autonomousdatabase.oc1.iad.abuwcljtthygmwsbbsr2e3ve5kwrtvyevpbr6sgmrocepqa6wtr2yx73xtoq ADWC STOPPED ocid1.autonomousdwdatabase.oc1.iad.abuwcljrbwuhg2iyzshauzvsjuxuqnd7wcg35xezlmxmtoitqhpw3hfqij3a
Start the services
In order to start the database, the call is simply /$service/$id/actions/start
instead of /$service/$id/actions/stop
for service in autonomousDatabases autonomousDataWarehouses do for id in $( oci-curl $endpoint get "/$apiVersion/$service?compartmentId=$compartmentId" \ | jq -r '.[] | select(.lifecycleState=="STOPPED")|.id' ) ; do oci-curl $endpoint post /dev/stdin "/$apiVersion/$service/$id/actions/start" <<<"{}" <<<"{}" | jq -r '.dbName + ": " + .lifecycleState' done done
So what?
This oci-curl() function is a very simple way to manage your autonomous database services, without having to install any tool. You just need the private key and a few environment variables. Looking at the script is also a good way to understand how to build the POST/GET request headers as expected by the Oracle Cloud REST API. Of course, for production, the OCI client or OCI SDK will be preferred.
The comments are closed on this post, but do not hesitate to give feedback, comment or questions on Twitter (@FranckPachot)