From 1c96d2294fed740c5684c51840a231dd766f235a Mon Sep 17 00:00:00 2001 From: James Falcon Date: Tue, 25 May 2021 11:11:50 -0500 Subject: [PATCH 1/3] Make OCI's availability domain required availability_domain used to be able to be inferred from the subnet. Now it is required to be passed manually. https://docs.oracle.com/en-us/iaas/tools/python/2.38.3/api/core/models/oci.core.models.Subnet.html#oci.core.models.Subnet.availability_domain --- pycloudlib/oci/cloud.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/pycloudlib/oci/cloud.py b/pycloudlib/oci/cloud.py index db5532ff..779ae36e 100644 --- a/pycloudlib/oci/cloud.py +++ b/pycloudlib/oci/cloud.py @@ -21,7 +21,7 @@ class OCI(BaseCloud): def __init__( self, tag, timestamp_suffix=True, compartment_id=None, - config_path='~/.oci/config', + availability_domain=None, config_path='~/.oci/config', ): """ Initialize the connection to OCI. @@ -35,6 +35,8 @@ def __init__( tag compartment_id: A compartment found at https://console.us-phoenix-1.oraclecloud.com/a/identity/compartments + availability_domain: One of the availability domains from: + 'oci iam availability-domain list' config_path: Path of OCI config file """ super().__init__(tag, timestamp_suffix) @@ -55,6 +57,10 @@ def __init__( compartment_id = json.loads(result.stdout)['data']['id'] self.compartment_id = compartment_id + if not availability_domain: + raise ValueError('availability_domain must be specified') + self.availability_domain = availability_domain + if not os.path.isfile(os.path.expanduser(config_path)): raise ValueError( '{} is not a valid config file. ' @@ -182,7 +188,6 @@ def launch(self, image_id, instance_type='VM.Standard2.1', user_data=None, subnet = self.network_client.list_subnets( self.compartment_id, vcn_id=vcn_id).data[0] subnet_id = subnet.id - availability_domain = subnet.availability_domain metadata = { 'ssh_authorized_keys': self.key_pair.public_key_content, @@ -193,7 +198,7 @@ def launch(self, image_id, instance_type='VM.Standard2.1', user_data=None, instance_details = oci.core.models.LaunchInstanceDetails( display_name=self.tag, - availability_domain=availability_domain, + availability_domain=self.availability_domain, compartment_id=self.compartment_id, shape=instance_type, subnet_id=subnet_id, From 544192f7d5b282a154dd0b1bd691949106d6de64 Mon Sep 17 00:00:00 2001 From: James Falcon Date: Fri, 28 May 2021 10:55:13 -0500 Subject: [PATCH 2/3] [squash] rearranging call args and adding example --- examples/base_api.py | 1 + examples/oci.py | 12 +++++++----- pycloudlib/oci/cloud.py | 10 ++++------ 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/examples/base_api.py b/examples/base_api.py index d56edf00..7413b31e 100644 --- a/examples/base_api.py +++ b/examples/base_api.py @@ -81,6 +81,7 @@ def exercise_api(client: BaseCloud, image_id=None): 'zone': 'a', }, pycloudlib.OCI: { + 'availability_domain': os.environ.get('AVAILABILITY_DOMAIN'), 'compartment_id': os.environ.get('COMPARTMENT_ID') }, pycloudlib.Openstack: { diff --git a/examples/oci.py b/examples/oci.py index 8c6dcd93..2db665a3 100644 --- a/examples/oci.py +++ b/examples/oci.py @@ -15,7 +15,7 @@ """ -def demo(compartment_id): +def demo(availability_domain, compartment_id): """Show example of using the OCI library. Connects to OCI and launches released image. Then runs @@ -23,6 +23,7 @@ def demo(compartment_id): """ client = pycloudlib.OCI( 'Oracle test', + availability_domain=availability_domain, compartment_id=compartment_id, ) @@ -46,8 +47,9 @@ def demo(compartment_id): if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) - if len(sys.argv) != 2: - print('Usage: oci.py ') + if len(sys.argv) != 3: + print('Usage: oci.py ') sys.exit(1) - passed_compartment_id = sys.argv[1] - demo(passed_compartment_id) + passed_availability_domain = sys.argv[1] + passed_compartment_id = sys.argv[2] + demo(passed_availability_domain, passed_compartment_id) diff --git a/pycloudlib/oci/cloud.py b/pycloudlib/oci/cloud.py index 779ae36e..27cba867 100644 --- a/pycloudlib/oci/cloud.py +++ b/pycloudlib/oci/cloud.py @@ -20,8 +20,8 @@ class OCI(BaseCloud): _type = 'oci' def __init__( - self, tag, timestamp_suffix=True, compartment_id=None, - availability_domain=None, config_path='~/.oci/config', + self, tag, *, availability_domain, timestamp_suffix=True, + compartment_id=None, config_path='~/.oci/config' ): """ Initialize the connection to OCI. @@ -40,6 +40,8 @@ def __init__( config_path: Path of OCI config file """ super().__init__(tag, timestamp_suffix) + self.availability_domain = availability_domain + if not compartment_id: command = ['oci', 'iam', 'compartment', 'get'] exception_text = ( @@ -57,10 +59,6 @@ def __init__( compartment_id = json.loads(result.stdout)['data']['id'] self.compartment_id = compartment_id - if not availability_domain: - raise ValueError('availability_domain must be specified') - self.availability_domain = availability_domain - if not os.path.isfile(os.path.expanduser(config_path)): raise ValueError( '{} is not a valid config file. ' From 4069b03893e7450c04eb34458073686a61fbc2bf Mon Sep 17 00:00:00 2001 From: James Falcon Date: Fri, 28 May 2021 11:00:01 -0500 Subject: [PATCH 3/3] [squash] Realized I can have my cake and eat it too! --- pycloudlib/oci/cloud.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pycloudlib/oci/cloud.py b/pycloudlib/oci/cloud.py index 27cba867..14f62a37 100644 --- a/pycloudlib/oci/cloud.py +++ b/pycloudlib/oci/cloud.py @@ -20,7 +20,7 @@ class OCI(BaseCloud): _type = 'oci' def __init__( - self, tag, *, availability_domain, timestamp_suffix=True, + self, tag, timestamp_suffix=True, *, availability_domain, compartment_id=None, config_path='~/.oci/config' ): """