|
| 1 | +# coding: utf-8 |
| 2 | +# Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. |
| 3 | + |
| 4 | +# This script provides an example of how use the cluster networks SDK in terms of: |
| 5 | +# - Creating an Instance Configuration |
| 6 | +# - Create a Cluster Network based on that configuration. |
| 7 | +# - Wait for the Cluster Network to go to Running state. |
| 8 | +# - List instance of the Cluster Network |
| 9 | +# - Terminating Cluster Network |
| 10 | +# - Deleting the Instance Configuration |
| 11 | +# |
| 12 | +# USAGE: |
| 13 | +# `python examples/cluster_networks_example.py \ |
| 14 | +# --compartment '<COMPARTMENT_ID>' \ |
| 15 | +# --availability-domain '<AVAILABILITY_DOMAIN>' \ |
| 16 | +# --subnet-id '<SUBNET_ID>' \ |
| 17 | +# --image-id '<IMAGE_ID>'` |
| 18 | +# |
| 19 | +# Example (create a cluster network in uk-london-1): |
| 20 | +# `python examples/cluster_networks_example.py \ |
| 21 | +# --compartment 'ocid1.compartment.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' \ |
| 22 | +# --availability-domain 'asdf:UK-LONDON-1-AD-1' \ |
| 23 | +# --subnet-id 'ocid1.subnet.oc1.uk-london-1.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' \ |
| 24 | +# --image-id 'ocid1.image.oc1.uk-london-1.aaaaaaaa5sh4s5zyq5p54zf26u7j2ne6k7q3ryzsajnhy264ydbyr74gqsoq'` |
| 25 | +# |
| 26 | + |
| 27 | +import oci |
| 28 | +import argparse |
| 29 | +from oci.core import ComputeManagementClient, ComputeManagementClientCompositeOperations |
| 30 | +from oci.core.models import CreateInstanceConfigurationDetails, \ |
| 31 | + InstanceConfigurationLaunchInstanceDetails, \ |
| 32 | + InstanceConfigurationInstanceSourceViaImageDetails, \ |
| 33 | + InstanceConfigurationCreateVnicDetails, \ |
| 34 | + ComputeInstanceDetails, \ |
| 35 | + InstanceConfigurationBlockVolumeDetails, \ |
| 36 | + InstanceConfigurationCreateVolumeDetails, \ |
| 37 | + InstanceConfigurationIscsiAttachVolumeDetails, \ |
| 38 | + CreateClusterNetworkDetails, \ |
| 39 | + ClusterNetworkPlacementConfigurationDetails, \ |
| 40 | + CreateClusterNetworkInstancePoolDetails |
| 41 | + |
| 42 | + |
| 43 | +def _create_block_volume_details(compartment_id, ad): |
| 44 | + """Sets up the model for a simple 50gb BV for use by tests. |
| 45 | + :returns: InstanceConfigurationBlockVolumeDetails |
| 46 | + """ |
| 47 | + block_volume_details = InstanceConfigurationBlockVolumeDetails() |
| 48 | + |
| 49 | + create_volume_details = InstanceConfigurationCreateVolumeDetails() |
| 50 | + create_volume_details.display_name = "blockvol1" |
| 51 | + create_volume_details.compartment_id = compartment_id |
| 52 | + create_volume_details.size_in_gbs = 50 |
| 53 | + create_volume_details.availability_domain = ad |
| 54 | + |
| 55 | + volume_attach_details = InstanceConfigurationIscsiAttachVolumeDetails() |
| 56 | + |
| 57 | + block_volume_details.create_details = create_volume_details |
| 58 | + block_volume_details.attach_details = volume_attach_details |
| 59 | + return block_volume_details |
| 60 | + |
| 61 | + |
| 62 | +# === Main === |
| 63 | + |
| 64 | +if __name__ == "__main__": |
| 65 | + |
| 66 | + # Load the default configuration |
| 67 | + config = oci.config.from_file() |
| 68 | + |
| 69 | + # parse arguments |
| 70 | + parser = argparse.ArgumentParser() |
| 71 | + parser.add_argument('--compartment-id', |
| 72 | + help='Your compartment OCID', |
| 73 | + required=True |
| 74 | + ) |
| 75 | + parser.add_argument('--availability-domain', |
| 76 | + help='the AD where the cluster network will be spun up (cluster network only spans a single AD)', |
| 77 | + required=True |
| 78 | + ) |
| 79 | + |
| 80 | + parser.add_argument('--subnet-id', |
| 81 | + help='the ', |
| 82 | + required=True |
| 83 | + ) |
| 84 | + |
| 85 | + parser.add_argument('--image-id', |
| 86 | + help='the image ID to use for instances', |
| 87 | + required=True |
| 88 | + ) |
| 89 | + |
| 90 | + args = parser.parse_args() |
| 91 | + |
| 92 | + # create the compute management client |
| 93 | + compute_management_client = ComputeManagementClient(config) |
| 94 | + composite_client = ComputeManagementClientCompositeOperations(compute_management_client) |
| 95 | + |
| 96 | + launch_details = InstanceConfigurationLaunchInstanceDetails( |
| 97 | + compartment_id=args.compartment_id, |
| 98 | + display_name="some hpc instance name", |
| 99 | + shape="BM.HPC2.36", |
| 100 | + source_details=InstanceConfigurationInstanceSourceViaImageDetails( |
| 101 | + image_id=args.image_id |
| 102 | + ), |
| 103 | + create_vnic_details=InstanceConfigurationCreateVnicDetails() |
| 104 | + ) |
| 105 | + |
| 106 | + instance_details = ComputeInstanceDetails( |
| 107 | + launch_details=launch_details, |
| 108 | + block_volumes=[ |
| 109 | + _create_block_volume_details(args.compartment_id, args.availability_domain) |
| 110 | + ]) |
| 111 | + |
| 112 | + create_instance_config_details = CreateInstanceConfigurationDetails( |
| 113 | + display_name="sample instance config name", |
| 114 | + compartment_id=args.compartment_id, |
| 115 | + instance_details=instance_details) |
| 116 | + |
| 117 | + try: |
| 118 | + # Creates an hpc instance configuration to use with cluster network |
| 119 | + instance_config = compute_management_client.create_instance_configuration( |
| 120 | + create_instance_config_details).data |
| 121 | + print("Created instanceConfiguration: ", instance_config) |
| 122 | + |
| 123 | + # Creates a placement configuration to be used when creating a pool |
| 124 | + placement_config = \ |
| 125 | + ClusterNetworkPlacementConfigurationDetails() |
| 126 | + placement_config.availability_domain = args.availability_domain |
| 127 | + placement_config.primary_subnet_id = args.subnet_id |
| 128 | + |
| 129 | + instance_pool_def = CreateClusterNetworkInstancePoolDetails() |
| 130 | + instance_pool_def.instance_configuration_id = instance_config.id |
| 131 | + instance_pool_def.size = 1 |
| 132 | + |
| 133 | + create_cluster_network_details = CreateClusterNetworkDetails() |
| 134 | + create_cluster_network_details.compartment_id = args.compartment_id |
| 135 | + create_cluster_network_details.display_name = "sample cluster network" |
| 136 | + create_cluster_network_details.instance_pools = [instance_pool_def] |
| 137 | + create_cluster_network_details.placement_configuration = placement_config |
| 138 | + |
| 139 | + # Create a cluster network. |
| 140 | + print("Creating cluster network: ", create_cluster_network_details) |
| 141 | + cluster_network = composite_client.create_cluster_network_and_wait_for_state( |
| 142 | + create_cluster_network_details, wait_for_states=["RUNNING"]).data |
| 143 | + |
| 144 | + print("Created cluster network: ", cluster_network) |
| 145 | + |
| 146 | + finally: |
| 147 | + # cleaning up created resources |
| 148 | + compute_management_client.terminate_cluster_network(cluster_network.id) |
| 149 | + print("Terminated cluster network: ", cluster_network) |
| 150 | + |
| 151 | + compute_management_client.delete_instance_configuration(instance_config.id) |
| 152 | + print("Deleted instanceConfiguration: ", instance_config) |
0 commit comments