community/dm-scaffolder/providers/project.py (82 lines of code) (raw):

# Copyright 2018 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. """ Provider classes for GCP Project""" import providers.baseprovider as base import sys from subprocess import check_output class ProjectBase(base.BaseProvider): """ Common implementation of Project APIs""" project_readonly_properties = [ "createTime"] def __init__(self, dm_api, gcloud_stage, gcloud_flags=''): self.host_projects = [] self.guest_projects = {} self.readonly_properties += self.project_readonly_properties base.BaseProvider.__init__(self, "", "projects", dm_api, gcloud_stage, gcloud_flags) def get_new(self): """ Virtual class to return a new instane of the matching provider class""" raise NotImplementedError('subclasses must override get_new()!') def get_list(self, gcloud_flags=""): projects_tmp = super(ProjectBase, self).get_list(gcloud_flags) projects_list=[] for project in projects_tmp: if project.properties['lifecycleState'] == "ACTIVE": project.properties.pop('lifecycleState', None) projects_list.append(project) self.get_vpc_host_project_ids() self.get_vpc_guest_project_ids() return projects_list def set_cft_defaults(self): self.base_yaml['properties']['removeDefaultVPC'] = True self.base_yaml['properties']['removeDefaultSA'] = True def get_vpc_host_project_ids(self): use_shell = sys.platform == 'win32' props = check_output(("gcloud compute shared-vpc organizations list-host-projects " + self.config.configs['organization_id'] + " --format yaml" ).split(), shell=use_shell).split('---') for prop in props: if prop is None: continue prop = self.yaml.load(prop) if prop is None: continue self.host_projects.append(prop['name']) def get_vpc_guest_project_ids(self): for id in self.host_projects: use_shell = sys.platform == 'win32' try: props = check_output(("gcloud compute shared-vpc associated-projects list " + id + " --format yaml" ).split(), shell=use_shell).split('---') for prop in props: if prop is None: continue prop = self.yaml.load(prop) if prop is None: continue self.guest_projects[prop['id']] = id except: print "Project " + id + "can't be reached. Potentially up for deletion." def set_as_vpc_host(self): #Not implemented by default return None def set_as_vpc_guest(self, host_id): #Not implemented by default return None class ProjectV1(ProjectBase): """ Project V1 API provider""" def __init__(self, gcloud_flags=''): ProjectBase.__init__( self, "gcp-types/cloudresourcemanager-v1:projects", "", gcloud_flags) def get_new(self): return ProjectV1() class ProjectCFT(ProjectBase): """ Project CFT API provider""" def __init__(self, gcloud_flags=''): ProjectBase.__init__( self, "../templates/project/project.py", "", gcloud_flags) def get_new(self): return ProjectCFT() def set_as_vpc_host(self): self.base_yaml['properties']['sharedVPCHost'] = True def set_as_vpc_guest(self, host_id): self.base_yaml['properties']['sharedVPC'] = host_id def get_list(self, gcloud_flags=""): projects_list = super(ProjectCFT, self).get_list(gcloud_flags) for project in projects_list: project.set_cft_defaults() if project.properties['projectId'] in self.host_projects: project.set_as_vpc_host() elif project.properties['projectId'] in self.guest_projects: project.set_as_vpc_guest(self.guest_projects[project.properties['projectId']]) use_shell = sys.platform == 'win32' props = self.yaml.load(check_output(("gcloud beta billing projects describe " + project.properties['projectId'] + " --format yaml" ).split(), shell=use_shell)) project.base_yaml['properties']['billingAccountId'] = props.get('billingAccountName') return projects_list