Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 3 additions & 11 deletions dbaas/drivers/replication_topologies/mysql.py
Original file line number Diff line number Diff line change
Expand Up @@ -495,19 +495,11 @@ def get_deploy_steps(self):
)}, {
'Creating virtual machine': (
'workflow.steps.util.host_provider.AllocateIP',
'workflow.steps.util.host_provider.CreateVirtualMachine',
'workflow.steps.util.host_provider.CreateMySqlFoxVirtualMachineWithEnvTag',
)}, {
'Creating VIP': (
'workflow.steps.util.vip_provider.CreateVip',
'workflow.steps.util.vip_provider.CreateInstanceGroup',
'workflow.steps.util.vip_provider.AddInstancesInGroup',
'workflow.steps.util.vip_provider.CreateHeathcheck',
'workflow.steps.util.vip_provider.CreateBackendService',
'workflow.steps.util.vip_provider.AllocateIP',
'workflow.steps.util.vip_provider.AllocateDNS',
'workflow.steps.util.vip_provider.CreateForwardingRule',
'workflow.steps.util.vip_provider.AddLoadBalanceLabels',
'workflow.steps.util.dns.RegisterDNSVip',
'workflow.steps.util.ingress_provider.AllocateProvider',
'workflow.steps.util.ingress_provider.RegisterDNSIngress',
)}, {
'Creating dns': (
'workflow.steps.util.dns.CreateDNS',
Expand Down
146 changes: 129 additions & 17 deletions dbaas/workflow/steps/util/host_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,72 @@ def create_host(self, infra, offering, name, team_name, zone=None,
host.save()
return host

def create_host_with_environment_tag_to_foxha(self, infra, offering, name, team_name, zone=None,
database_name='', host_obj=None, port=None,
volume_name=None, init_user=None, init_password=None,
static_ip=None):
url = "{}/{}/{}/host/new".format(
self.credential.endpoint, self.provider, self.environment
)

data = {
"engine": self.engine,
"name": name,
"cpu": offering.cpus,
"memory": offering.memory_size_mb,
"group": infra.name,
"team_name": team_name,
"database_name": database_name,
"static_ip_id": static_ip and static_ip.identifier,
"service_account": self.infra_service_account
}
if zone:
data['zone'] = zone
if port:
data['port'] = port
if volume_name:
data['volume_name'] = volume_name
if init_user:
data['init_user'] = init_user
if init_password:
data['init_password'] = init_password

dev = ['gcp-lab-dev']
devqa = ['dev-gcp-hdg-us-east1', 'dev-gcp-hdg-sa-east1', 'dev-gcp-hdg-us-central1',
'dev-gcp-tsuru-us-east1', 'dev-gcp-tsuru-sa-east1', 'dev-gcp-tsuru-us-central1',
'dbaas-devqa-gcp-us-east1']
prod = ['prod-gcp-hdg-us-east1', 'prod-gcp-hdg-sa-east-1', 'prod-gcp-hdg-us-central1',
'prod-gcp-tsuru-us-east1', 'prod-gcp-tsuru-sa-east1', 'prod-gcp-tsuru-us-central1']
tag = ''
env = infra.environment.name
if env in dev:
tag = 'dbaas-nodes-dev'
elif env in devqa:
tag = 'dbaas-nodes-devqa'
elif env in prod:
tag = 'dbaas-nodes-prod'
data['environment_tag'] = tag

response = self._request(post, url, json=data, timeout=900)
if response.status_code != 201:
raise HostProviderCreateVMException(response.content, response)

content = response.json()
if host_obj is None:
host = Host()
host.hostname = content["address"]
else:
host = host_obj
host.address = content["address"]
host.user = self.vm_credential.user
host.password = self.vm_credential.password
host.private_key = self.vm_credential.private_key
host.provider = self.provider
host.identifier = content["id"]
host.offering = offering
host.save()
return host

def create_static_ip(self, infra):
url = "{}/{}/{}/ip/".format(
self.credential.endpoint, self.provider, self.environment
Expand Down Expand Up @@ -516,15 +582,15 @@ class Stop(HostProviderStep):

def __unicode__(self):
return "Stopping VM..."

@property
def is_valid(self):
return not self.instance.temporary

def do(self):
if not self.is_valid:
return

stopped = self.provider.stop()
if not stopped:
raise EnvironmentError("Could not stop VM")
Expand Down Expand Up @@ -552,7 +618,7 @@ def __unicode__(self):
def do(self):
if not self.is_valid:
return

started = self.provider.start()
if not started:
raise EnvironmentError("Could not start VM")
Expand Down Expand Up @@ -627,7 +693,7 @@ def __unicode__(self):
def do(self):
if not self.is_valid:
return

success = self.provider.new_offering(self.target_offering)
if not success:
raise Exception("Could not change offering")
Expand Down Expand Up @@ -751,6 +817,52 @@ def undo(self):
host.delete()


class CreateMySqlFoxVirtualMachineWithEnvTag(CreateVirtualMachine):

def __unicode__(self):
return "Creating Mysql Fox virtual machine..."

def do(self):
task_manager = self.create or self.destroy
if hasattr(self, 'step_manager') and task_manager is None:
task_manager = self.step_manager
try:
pair = self.infra.instances.get(dns=self.instance.dns)
except Instance.DoesNotExist:
host = self.provider.create_host_with_environment_tag_to_foxha(
self.infra, self.offering, self.vm_name, self.team, self.zone,
database_name=(self.database.name if self.database
else task_manager.name),
static_ip=self.instance.static_ip
)
self.update_databaseinfra_last_vm_created()
else:
host = pair.hostname

self.create_instance(host)
self.associate_static_ip_with_instance()

def undo(self):
try:
host = self.instance.hostname
except ObjectDoesNotExist:
self.delete_instance()
return

try:
self.provider.destroy_host(self.host)
except HostProviderDestroyVMException as e:
content, response = e
if response.status_code == 404:
LOG.warning('Host {} not found in host-provider'.format(self.host))
else:
raise e

self.delete_instance()
if host.id:
host.delete()


class DestroyVirtualMachineTemporaryInstance(CreateVirtualMachine):

def __unicode__(self):
Expand All @@ -759,16 +871,16 @@ def __unicode__(self):
@property
def is_valid(self):
return self.instance.temporary

def do(self):
if not self.is_valid:
return

return super(DestroyVirtualMachineTemporaryInstance, self).undo()


class CreateVirtualMachineTemporaryInstance(CreateVirtualMachine):

@property
def is_valid(self):
return self.instance.temporary
Expand All @@ -782,7 +894,7 @@ def create_instance(self, host):
def do(self):
if self.is_valid:
super(CreateVirtualMachineTemporaryInstance, self).do()

def undo(self):
if self.is_valid:
super(CreateVirtualMachineTemporaryInstance, self).undo()
Expand All @@ -804,19 +916,20 @@ def undo(self):


class AllocateIPTemporaryInstance(AllocateIP):

@property
def is_valid(self):
return self.instance.temporary

def do(self):
if self.is_valid:
super(AllocateIPTemporaryInstance, self).do()

def undo(self):
if self.is_valid:
super(AllocateIPTemporaryInstance, self).undo()


class AllocateIPRegionMigrate(HostProviderStep):

@property
Expand Down Expand Up @@ -1020,7 +1133,6 @@ def do(self):


class WaitingBeReady(HostProviderStep):

RETRIES = 30

def __unicode__(self):
Expand Down Expand Up @@ -1192,21 +1304,21 @@ def do(self):

def undo(self):
raise NotImplementedError


class DestroyIPTemporaryInstance(DestroyIPMigrate):

def __unicode__(self):
return "Destroy IP..."

@property
def is_valid(self):
return self.instance.temporary

def do(self):
if not self.is_valid:
return

return super(DestroyIPTemporaryInstance, self).do()


Expand All @@ -1221,7 +1333,7 @@ def environment(self):

def do(self):
pass
#super(DestroyServiceAccountMigrate, self).undo()
# super(DestroyServiceAccountMigrate, self).undo()

def undo(self):
raise NotImplementedError
Loading