Source code for gcloud_utils.compute
"""Module to handle Google Compute Service"""
import time
import logging
from googleapiclient import discovery
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')
[docs]class Compute(object):
"""Google-compute-engine handler"""
def __init__(self, project, zone):
self.project = project
self.zone = zone
self.logger = logging.getLogger(name=self.__class__.__name__)
self.client = discovery.build('compute', 'v1')
self.__update_instances(self.client)
def __request_instances_info(self, client):
instances = client.instances().list(
project=self.project, zone=self.zone).execute()
return instances[u'items']
def __update_instances(self, client):
intances_itens = self.__request_instances_info(client)
result = {}
for i in intances_itens:
result.update({i[u'name']: i[u'status']})
self.intances = result
def __check_status(self, instance_name, expected_status, max_time=400):
sleep_time = 10
max_check = max_time/sleep_time
i = 0
while (not self.intances[instance_name] == expected_status) and (i <= max_check):
self.logger.info("waiting to %s ...", expected_status)
self.__update_instances(self.client)
time.sleep(sleep_time)
i += 1
return True
def __change_status(self, instance_name, action, expecte_status):
try:
status = self.intances[instance_name]
self.logger.debug("%s status: %s", instance_name, status)
if not status == expecte_status:
action(zone=self.zone, project=self.project,
instance=instance_name).execute()
self.__check_status(instance_name, expecte_status)
except KeyError:
raise Exception("Instence %s doesn't exists" % instance_name)
[docs] def start_instance(self, instance_name):
"""Start VM by name"""
self.__change_status(
instance_name, self.client.instances().start, "RUNNING")
[docs] def stop_instance(self, instance_name):
"""Stop VM by name"""
self.__change_status(
instance_name, self.client.instances().stop, "TERMINATED")