192 lines
5.9 KiB
Python
192 lines
5.9 KiB
Python
#!/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
|
|
|
|
|
|
# [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]
|