chore: Moving GCE API samples from python-docs-samples (b/191786905) (#1429)
Co-authored-by: Anthonios Partheniou <partheniou@google.com>
diff --git a/samples/compute/create_instance.py b/samples/compute/create_instance.py
new file mode 100644
index 0000000..3ccffc5
--- /dev/null
+++ b/samples/compute/create_instance.py
@@ -0,0 +1,192 @@
+#!/usr/bin/env python
+
+# Copyright 2015 Google Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Example of using the Compute Engine API to create and delete instances.
+
+Creates a new compute engine instance and uses it to apply a caption to
+an image.
+
+For more information, see the README.md under samples/compute.
+"""
+
+import argparse
+import os
+import time
+
+import googleapiclient.discovery
+from six.moves import input
+
+
+# [START compute_apiary_list_instances]
+def list_instances(compute, project, zone):
+ result = compute.instances().list(project=project, zone=zone).execute()
+ return result['items'] if 'items' in result else None
+# [END compute_apiary_list_instances]
+
+
+# [START compute_apiary_create_instance]
+def create_instance(compute, project, zone, name, bucket):
+ # Get the latest Debian Jessie image.
+ image_response = compute.images().getFromFamily(
+ project='debian-cloud', family='debian-9').execute()
+ source_disk_image = image_response['selfLink']
+
+ # Configure the machine
+ machine_type = "zones/%s/machineTypes/n1-standard-1" % zone
+ startup_script = open(
+ os.path.join(
+ os.path.dirname(__file__), 'startup-script.sh'), 'r').read()
+ image_url = "http://storage.googleapis.com/gce-demo-input/photo.jpg"
+ image_caption = "Ready for dessert?"
+
+ config = {
+ 'name': name,
+ 'machineType': machine_type,
+
+ # Specify the boot disk and the image to use as a source.
+ 'disks': [
+ {
+ 'boot': True,
+ 'autoDelete': True,
+ 'initializeParams': {
+ 'sourceImage': source_disk_image,
+ }
+ }
+ ],
+
+ # Specify a network interface with NAT to access the public
+ # internet.
+ 'networkInterfaces': [{
+ 'network': 'global/networks/default',
+ 'accessConfigs': [
+ {'type': 'ONE_TO_ONE_NAT', 'name': 'External NAT'}
+ ]
+ }],
+
+ # Allow the instance to access cloud storage and logging.
+ 'serviceAccounts': [{
+ 'email': 'default',
+ 'scopes': [
+ 'https://www.googleapis.com/auth/devstorage.read_write',
+ 'https://www.googleapis.com/auth/logging.write'
+ ]
+ }],
+
+ # Metadata is readable from the instance and allows you to
+ # pass configuration from deployment scripts to instances.
+ 'metadata': {
+ 'items': [{
+ # Startup script is automatically executed by the
+ # instance upon startup.
+ 'key': 'startup-script',
+ 'value': startup_script
+ }, {
+ 'key': 'url',
+ 'value': image_url
+ }, {
+ 'key': 'text',
+ 'value': image_caption
+ }, {
+ 'key': 'bucket',
+ 'value': bucket
+ }]
+ }
+ }
+
+ return compute.instances().insert(
+ project=project,
+ zone=zone,
+ body=config).execute()
+# [END compute_apiary_create_instance]
+
+
+# [START compute_apiary_delete_instance]
+def delete_instance(compute, project, zone, name):
+ return compute.instances().delete(
+ project=project,
+ zone=zone,
+ instance=name).execute()
+# [END compute_apiary_delete_instance]
+
+
+# [START compute_apiary_wait_for_operation]
+def wait_for_operation(compute, project, zone, operation):
+ print('Waiting for operation to finish...')
+ while True:
+ result = compute.zoneOperations().get(
+ project=project,
+ zone=zone,
+ operation=operation).execute()
+
+ if result['status'] == 'DONE':
+ print("done.")
+ if 'error' in result:
+ raise Exception(result['error'])
+ return result
+
+ time.sleep(1)
+# [END compute_apiary_wait_for_operation]
+
+
+# [START compute_apiary_run]
+def main(project, bucket, zone, instance_name, wait=True):
+ compute = googleapiclient.discovery.build('compute', 'v1')
+
+ print('Creating instance.')
+
+ operation = create_instance(compute, project, zone, instance_name, bucket)
+ wait_for_operation(compute, project, zone, operation['name'])
+
+ instances = list_instances(compute, project, zone)
+
+ print('Instances in project %s and zone %s:' % (project, zone))
+ for instance in instances:
+ print(' - ' + instance['name'])
+
+ print("""
+Instance created.
+It will take a minute or two for the instance to complete work.
+Check this URL: http://storage.googleapis.com/{}/output.png
+Once the image is uploaded press enter to delete the instance.
+""".format(bucket))
+
+ if wait:
+ input()
+
+ print('Deleting instance.')
+
+ operation = delete_instance(compute, project, zone, instance_name)
+ wait_for_operation(compute, project, zone, operation['name'])
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(
+ description=__doc__,
+ formatter_class=argparse.RawDescriptionHelpFormatter)
+ parser.add_argument('project_id', help='Your Google Cloud project ID.')
+ parser.add_argument(
+ 'bucket_name', help='Your Google Cloud Storage bucket name.')
+ parser.add_argument(
+ '--zone',
+ default='us-central1-f',
+ help='Compute Engine zone to deploy to.')
+ parser.add_argument(
+ '--name', default='demo-instance', help='New instance name.')
+
+ args = parser.parse_args()
+
+ main(args.project_id, args.bucket_name, args.zone, args.name)
+# [END compute_apiary_run]