def stopVolume(self, instanceNo, volumeNo): tableCSVOL = self.conn.getTable("CLOUDSTACK_VOLUME") csVolumes = self.conn.selectOne(tableCSVOL.select(tableCSVOL.c.VOLUME_NO==volumeNo)) # ボリュームIDがない場合はスキップ if (isEmpty(csVolumes["VOLUME_ID"])): return # インスタンスIDがない場合はスキップ if (isEmpty(csVolumes["INSTANCE_ID"])) : return; try : # ボリュームのデタッチ self.detachVolume(instanceNo, volumeNo) except Exception, e: self.logger.error(traceback.format_exc()) # 情報が不整合(インスタンス異常終了時など)の場合、警告ログと後始末のみ行う self.logger.warn(e.massage); updateDict = self.conn.selectOne(tableCSVOL.select(tableCSVOL.c.VOLUME_NO==volumeNo)) updateDict["STATE"] = "error" updateDict["INSTANCE_ID"] = None sql = tableCSVOL.update(tableCSVOL.c.VOLUME_NO ==updateDict["VOLUME_NO"], values=updateDict) self.conn.execute(sql)
def stopVolume(self, instanceNo, volumeNo): table = self.conn.getTable("AWS_VOLUME") awsVolume = self.conn.selectOne( table.select(table.c.VOLUME_NO == volumeNo)) # ボリュームIDがない場合はスキップ if (isEmpty(awsVolume["VOLUME_ID"])): return # インスタンスIDがない場合はスキップ if (isEmpty(awsVolume["INSTANCE_ID"])): return try: # ボリュームのデタッチ self.detachVolume(instanceNo, volumeNo) # ボリュームのデタッチ待ち self.waitDetachVolume(instanceNo, volumeNo) except Exception, e: self.logger.error(traceback.format_exc()) # 情報が不整合(インスタンス異常終了時など)の場合、警告ログと後始末のみ行う self.logger.warn(e.massage) table = self.conn.getTable("AWS_VOLUME") updateDict = self.conn.selectOne( table.select(table.c.VOLUME_NO == volumeNo)) updateDict["STATUS"] = "error" updateDict["INSTANCE_ID"] = None sql = table.update(table.c.VOLUME_NO == updateDict["VOLUME_NO"], values=updateDict) self.conn.execute(sql)
def stopVolume(self, instanceNo, volumeNo): table = self.conn.getTable('AZURE_DISK') volume = self.conn.selectOne(table.select(table.c.DISK_NO == volumeNo)) # ボリューム名がない場合はスキップ if (isEmpty(volume['DISK_NAME'])): return # インスタンス名がある場合はスキップ if (isEmpty(volume['INSTANCE_NAME'])): return self.detachVolume(instanceNo, volumeNo) return
def stopVolume(self, instanceNo, volumeNo) : table = self.conn.getTable('AZURE_DISK') volume = self.conn.selectOne(table.select(table.c.DISK_NO==volumeNo)) # ボリューム名がない場合はスキップ if (isEmpty(volume['DISK_NAME'])) : return # インスタンス名がある場合はスキップ if (isEmpty(volume['INSTANCE_NAME'])) : return self.detachVolume(instanceNo, volumeNo) return
def startInstance(self, instanceNo): #AWS_INSTANCE 取得 tableCSINS = self.conn.getTable("CLOUDSTACK_INSTANCE") csInstance = self.conn.selectOne(tableCSINS.select(tableCSINS.c.INSTANCE_NO==instanceNo)) #PCC_INSTANCE 取得 tableINS = self.conn.getTable("INSTANCE") pccInstance = self.conn.selectOne(tableINS.select(tableINS.c.INSTANCE_NO==instanceNo)) #イメージの取得 再考の余地あり image = getImage(pccInstance["IMAGE_NO"]) # if isEmpty(csInstance["INSTANCE_ID"]): #インスタンスの作成 self.run(instanceNo, csInstance, pccInstance, image) #winodowsなら if (startsWithIgnoreCase(image["os"], "windows")): #INSTANCE_ID取得の為、CLOUDSTACK_INSTANCE 再取得 csInstance = self.conn.selectOne(tableCSINS.select(tableCSINS.c.INSTANCE_NO==instanceNo)) self.client.getPasswordData(csInstance["INSTANCE_ID"]) else: # インスタンスが停止中でない場合はスキップ if (csInstance["STATE"] != "Stopped"): return; # インスタンスの起動 self.start(instanceNo, csInstance, pccInstance)
def stopVolume(self, instanceNo, diskNo): table = self.conn.getTable("VCLOUD_DISK") disk = self.conn.selectOne(table.select(table.c.DISK_NO==diskNo)) #VCloud_INSTANCE 取得 tableVCINS = self.conn.getTable("VCLOUD_INSTANCE") vcInstance = self.conn.selectOne(tableVCINS.select(tableVCINS.c.INSTANCE_NO==instanceNo)) # DISKNAMEがない場合はスキップ if (isEmpty(disk["DISK_ID"])): return try : # ボリュームのデタッチ self.detachVolume(vcInstance, disk) except Exception, e: self.logger.error(traceback.format_exc()) # 情報が不整合(インスタンス異常終了時など)の場合、警告ログと後始末のみ行う self.logger.warn(e.massage); updateDict = self.conn.selectOne(table.select(table.c.DISK_NO==diskNo)) updateDict["DISK_ID"] = None updateDict["ATTACHED"] = False updateDict["UNIT_NO"] = None sql = table.update(table.c.DISK_NO ==updateDict["DISK_NO"], values=updateDict) self.conn.execute(sql)
def createTag(self, instanceNo, pccInstance): #INSTANCE 取得 tableINS = self.conn.getTable("INSTANCE") instance = self.conn.selectOne( tableINS.select(tableINS.c.INSTANCE_NO == instanceNo)) #FARM 取得 tableFARM = self.conn.getTable("FARM") farm = self.conn.selectOne( tableFARM.select(tableFARM.c.FARM_NO == instance["FARM_NO"])) #AWS_INSTANCE 取得 tableAWSINS = self.conn.getTable("AWS_INSTANCE") awsInstance = self.conn.selectOne( tableAWSINS.select(tableAWSINS.c.INSTANCE_NO == instanceNo)) # Eucalyptusの場合はタグを付けない platform = self.platforminfo["platformName"] if (platform == "eucalyptus"): return # Nameタグを追加する tags = [] tags.append(TagSet(None, None, "Name", pccInstance["FQDN"])) tags.append(TagSet(None, None, "UserName", self.client.getUsername())) tags.append(TagSet(None, None, "CloudName", farm["DOMAIN_NAME"])) tags.append(TagSet(None, None, "ServerName", pccInstance["FQDN"])) self.client.createTags(awsInstance["INSTANCE_ID"], tags) # EBSイメージでなければ終わり image = getImage(pccInstance["IMAGE_NO"]) if (isEmpty(image["ebsImage"]) == False): return instance2 = self.client.describeInstance(awsInstance["INSTANCE_ID"])
def createUserData(self, instanceNo, pccInstance, awsInstance): table = self.conn.getTable("FARM") fram = self.conn.selectOne(table.select(table.c.FARM_NO==pccInstance["FARM_NO"])) #UserDataを作成 userData = {} #DB情報 userData.update({"instanceName": pccInstance["INSTANCE_NAME"]}) userData.update({"farmName": fram["FARM_NAME"]}) # FQDN userData.update({"hostname": pccInstance["FQDN"]}) #初期スクリプト情報 userData.update({"scriptserver": getScriptProperty("script.server")}) #DNS情報 userData.update(self.createDnsUserData(instanceNo)) # Puppet情報 userData.update(self.createPuppetUserData()) # VPN情報 internal = self.platforminfo["internal"] if (internal == 0): if (isEmpty(awsInstance["SUBNET_ID"])): # 外部のプラットフォームでVPCを利用しない場合、VPN情報を含める userData.update(self.createVpnUserData(pccInstance)) return userData;
def stopVolume(self, instanceNo, diskNo): table = self.conn.getTable("VCLOUD_DISK") disk = self.conn.selectOne(table.select(table.c.DISK_NO == diskNo)) #VCloud_INSTANCE 取得 tableVCINS = self.conn.getTable("VCLOUD_INSTANCE") vcInstance = self.conn.selectOne( tableVCINS.select(tableVCINS.c.INSTANCE_NO == instanceNo)) # DISKNAMEがない場合はスキップ if (isEmpty(disk["DISK_ID"])): return try: # ボリュームのデタッチ self.detachVolume(vcInstance, disk) except Exception, e: self.logger.error(traceback.format_exc()) # 情報が不整合(インスタンス異常終了時など)の場合、警告ログと後始末のみ行う self.logger.warn(e.massage) updateDict = self.conn.selectOne( table.select(table.c.DISK_NO == diskNo)) updateDict["DISK_ID"] = None updateDict["ATTACHED"] = False updateDict["UNIT_NO"] = None sql = table.update(table.c.DISK_NO == updateDict["DISK_NO"], values=updateDict) self.conn.execute(sql)
def stopInstance(self, instanceNo): #AWS_INSTANCE 取得 tableCSINS = self.conn.getTable("CLOUDSTACK_INSTANCE") csInstance = self.conn.selectOne(tableCSINS.select(tableCSINS.c.INSTANCE_NO==instanceNo)) #PCC_INSTANCE 取得 tableINS = self.conn.getTable("INSTANCE") pccInstance = self.conn.selectOne(tableINS.select(tableINS.c.INSTANCE_NO==instanceNo)) # インスタンスIDがない場合は確認する if (isEmpty(csInstance["INSTANCE_ID"])): #起動ミス対策 nodes = self.client.describeInstances(name = pccInstance["INSTANCE_NAME"]) if not nodes or len(nodes) == 0: #インスタンスが存在しない場合 return; if len(nodes) >= 1: #FQDNを比較する for node in nodes: if pccInstance["FQDN"] == node.extra["displayname"]: #起動をミスったインスタンスを発見した場合 #ID情報を更新 csInstance["INSTANCE_ID"] = node.id sql = tableCSINS.update(tableCSINS.c.INSTANCE_NO ==csInstance["INSTANCE_NO"], values=csInstance) self.conn.execute(sql) # インスタンスの停止 self.stop(instanceNo, csInstance, pccInstance)
def stopAddress(self, instanceNo): # アドレス情報の取得 awsAddress = self.getAwsAddress(instanceNo) # アドレス情報がない場合は終了 if not awsAddress: return # インスタンスIDがない場合はスキップ if isEmpty(awsAddress["INSTANCE_ID"]): return addressNo = awsAddress["ADDRESS_NO"] try: # アドレスのステータスチェック self.checkAssociatedAddress(instanceNo, addressNo) # アドレスの切り離し self.disassociateAddress(instanceNo, addressNo) except Exception, e: # 情報が不整合(インスタンス異常終了時など)の場合、警告ログと後始末のみ行う self.logger.warn(e.__repr__()) table = self.conn.getTable("AWS_ADDRESS") updateDict = self.conn.selectOne( table.select(table.c.ADDRESS_NO == addressNo)) updateDict["INSTANCE_ID"] = None sql = table.update(table.c.ADDRESS_NO == updateDict["ADDRESS_NO"], values=updateDict) self.conn.execute(sql)
def stopAddress(self, instanceNo) : # アドレス情報の取得 awsAddress = self.getAwsAddress(instanceNo); # アドレス情報がない場合は終了 if not awsAddress: return # インスタンスIDがない場合はスキップ if isEmpty(awsAddress["INSTANCE_ID"]): return; addressNo = awsAddress["ADDRESS_NO"] try : # アドレスのステータスチェック self.checkAssociatedAddress(instanceNo, addressNo) # アドレスの切り離し self.disassociateAddress(instanceNo, addressNo) except Exception, e: # 情報が不整合(インスタンス異常終了時など)の場合、警告ログと後始末のみ行う self.logger.warn(e.__repr__()); table = self.conn.getTable("AWS_ADDRESS") updateDict = self.conn.selectOne(table.select(table.c.ADDRESS_NO==addressNo)) updateDict["INSTANCE_ID"] = None sql = table.update(table.c.ADDRESS_NO ==updateDict["ADDRESS_NO"], values=updateDict) self.conn.execute(sql)
def createTag(self, instanceNo, pccInstance): #INSTANCE 取得 tableINS = self.conn.getTable("INSTANCE") instance = self.conn.selectOne(tableINS.select(tableINS.c.INSTANCE_NO==instanceNo)) #FARM 取得 tableFARM = self.conn.getTable("FARM") farm = self.conn.selectOne(tableFARM.select(tableFARM.c.FARM_NO==instance["FARM_NO"])) #AWS_INSTANCE 取得 tableAWSINS = self.conn.getTable("AWS_INSTANCE") awsInstance = self.conn.selectOne(tableAWSINS.select(tableAWSINS.c.INSTANCE_NO==instanceNo)) # Eucalyptusの場合はタグを付けない platform = self.platforminfo["platformName"] if (platform == "eucalyptus"): return # Nameタグを追加する tags = [] tags.append(TagSet(None, None, "Name", pccInstance["FQDN"])) tags.append(TagSet(None, None, "UserName", self.client.getUsername())) tags.append(TagSet(None, None, "CloudName", farm["DOMAIN_NAME"])) tags.append(TagSet(None, None, "ServerName", pccInstance["FQDN"])) self.client.createTags(awsInstance["INSTANCE_ID"], tags) # EBSイメージでなければ終わり image = getImage(pccInstance["IMAGE_NO"]) if (isEmpty(image["ebsImage"])==False): return instance2 = self.client.describeInstance(awsInstance["INSTANCE_ID"])
def startInstance(self, instanceNo): #AWS_INSTANCE 取得 tableAWSINS = self.conn.getTable("AWS_INSTANCE") awsInstance = self.conn.selectOne( tableAWSINS.select(tableAWSINS.c.INSTANCE_NO == instanceNo)) #PCC_INSTANCE 取得 tableINS = self.conn.getTable("INSTANCE") pccInstance = self.conn.selectOne( tableINS.select(tableINS.c.INSTANCE_NO == instanceNo)) #イメージの取得 再考の余地あり image = getImage(pccInstance["IMAGE_NO"]) # インスタンスイメージの場合や、EBSイメージでインスタンスIDがない場合 if (image["ebsImage"] == "false" or isEmpty(awsInstance["INSTANCE_ID"])): #インスタンスIDがある場合はスキップ if (isEmpty(awsInstance["INSTANCE_ID"]) == False): return #インスタンスの作成 self.run(instanceNo, awsInstance, pccInstance, image) #インスタンスの作成待ち self.waitRun(instanceNo, pccInstance) #インスタンスにタグをつける self.createTag(instanceNo, pccInstance) #winodowsなら if (startsWithIgnoreCase(image["os"], "windows")): self.waitGetPasswordData(instanceNo, awsInstance) # EBSイメージでインスタンスIDがある場合 else: # インスタンスが停止中でない場合はスキップ if (awsInstance["STATUS"] != "stopped"): return # インスタンスの起動 self.start(instanceNo, awsInstance, pccInstance) # インスタンスの起動待ち self.waitStart(instanceNo, pccInstance)
def stopInstance(self, instanceNo): self.logger.info(' StopInstance: %s' % (instanceNo)) # インスタンスIDの取得 openstackInstanceTable = self.conn.getTable("OPENSTACK_INSTANCE") openstackInstanceInfo = self.conn.selectOne(openstackInstanceTable.select\ (openstackInstanceTable.c.INSTANCE_NO==instanceNo)) openstackInstanceId = openstackInstanceInfo['INSTANCE_ID'] # インスタンス名の取得 instanceTable = self.conn.getTable("INSTANCE") instanceInfo = self.conn.selectOne(instanceTable.select\ (instanceTable.c.INSTANCE_NO==instanceNo)) instanceName = instanceInfo['FQDN'] if isEmpty(openstackInstanceId): # 一度もStartしたことがない self.logger.info(' Nonexistent Instance: %s' % (instanceName)) raise IaasException("EPROCESS-001006", [instanceName]) # ステータスを確認する try: status = self.client.getVirtualMachineStatus(openstackInstanceId) except: raise IaasException("EPROCESS-001008", [instanceName]) if status == 'SHUTOFF': # 既にインスタンスは起動しているため、statusを更新して終了する。 self.logger.info(' Instance: %s is already SHUTOFF' % (instanceName)) # データベース更新 table = self.conn.getTable("OPENSTACK_INSTANCE") updateDict = self.conn.selectOne(table.select(table.c.INSTANCE_NO==instanceNo)) updateDict["STATUS"] = status sql = table.update(table.c.INSTANCE_NO == updateDict["INSTANCE_NO"], values=updateDict) self.conn.execute(sql) return True self.logger.info(' Stopping Instance: %s' % (instanceName)) try: instanceObj = self.client.stopVirtualMachine(openstackInstanceId) except: raise IaasException("EPROCESS-001006", [instanceName]) status = instanceObj.status if status != 'SHUTOFF': raise IaasException("EPROCESS-001007", [instanceName, status]) self.logger.info(' StopInstance finished. Status: %s' % (status)) # データベース更新 table = self.conn.getTable("OPENSTACK_INSTANCE") updateDict = self.conn.selectOne(table.select(table.c.INSTANCE_NO==instanceNo)) updateDict["STATUS"] = status sql = table.update(table.c.INSTANCE_NO == updateDict["INSTANCE_NO"], values=updateDict) self.conn.execute(sql) return True
def startInstance(self, instanceNo): #AWS_INSTANCE 取得 tableAWSINS = self.conn.getTable("AWS_INSTANCE") awsInstance = self.conn.selectOne(tableAWSINS.select(tableAWSINS.c.INSTANCE_NO==instanceNo)) #PCC_INSTANCE 取得 tableINS = self.conn.getTable("INSTANCE") pccInstance = self.conn.selectOne(tableINS.select(tableINS.c.INSTANCE_NO==instanceNo)) #イメージの取得 再考の余地あり image = getImage(pccInstance["IMAGE_NO"]) # インスタンスイメージの場合や、EBSイメージでインスタンスIDがない場合 if(image["ebsImage"] == "false" or isEmpty(awsInstance["INSTANCE_ID"])): #インスタンスIDがある場合はスキップ if (isEmpty(awsInstance["INSTANCE_ID"])==False): return; #インスタンスの作成 self.run(instanceNo, awsInstance, pccInstance, image) #インスタンスの作成待ち self.waitRun(instanceNo, pccInstance) #インスタンスにタグをつける self.createTag(instanceNo, pccInstance) #winodowsなら if (startsWithIgnoreCase(image["os"], "windows")): self.waitGetPasswordData(instanceNo, awsInstance) # EBSイメージでインスタンスIDがある場合 else: # インスタンスが停止中でない場合はスキップ if (awsInstance["STATUS"] != "stopped"): return; # インスタンスの起動 self.start(instanceNo, awsInstance, pccInstance) # インスタンスの起動待ち self.waitStart(instanceNo, pccInstance)
def getPasswordData(self, InstanceId): params = {"Action": "GetPasswordData", "InstanceId": InstanceId} elem = self.connection.request(self.path, params=params).object # True Falseを受ける passwdData = findattr(element=elem, xpath="passwordData", namespace=NAMESPACE) if isEmpty(passwdData): # パスワードデータを取得できない場合 raise IaasException("EPROCESS-000133", [InstanceId]) return passwdData
def stopInstance(self, instanceNo): # インスタンス名の取得 azureInstanceTable = self.conn.getTable("AZURE_INSTANCE") azureInstanceInfo = self.conn.selectOne(azureInstanceTable.select\ (azureInstanceTable.c.INSTANCE_NO==instanceNo)) instanceName = azureInstanceInfo['INSTANCE_NAME'] #1度も起動されていない if (isEmpty(instanceName)) : return instanceTable = self.conn.getTable("INSTANCE") instanceInfo = self.conn.selectOne(instanceTable.select\ (instanceTable.c.INSTANCE_NO==instanceNo)) platformNo = instanceInfo['PLATFORM_NO'] platformAzureTable = self.conn.getTable("PLATFORM_AZURE") platformAzureInfo = self.conn.selectOne(platformAzureTable.select\ (platformAzureTable.c.PLATFORM_NO==platformNo)) # クラウドサービス名の取得 cloudService = platformAzureInfo['CLOUD_SERVICE_NAME'] status = self.client.getVirtualMachineStatus(cloudService, instanceName) self.logger.info(' Instance: %s, Status: %s' % (instanceName, status)) if status != 'ReadyRole' and status != 'RoleStateUnknown': if status == 'StoppedVM': self.logger.info(' Instance: %s is already stopped' % (instanceName)) else: # 停止できる状態ではない。 raise IaasException("EPROCESS-000908", [instanceName, status]) else: status = self.client.stopVirtualMachine(cloudService, instanceName) # データベース更新 table = self.conn.getTable("AZURE_INSTANCE") updateDict = self.conn.selectOne(table.select(table.c.INSTANCE_NO==instanceNo)) updateDict["STATUS"] = status sql = table.update(table.c.INSTANCE_NO == updateDict["INSTANCE_NO"], values=updateDict) self.conn.execute(sql) # ボリュームに関する処理 azureDiskTable = self.conn.getTable("AZURE_DISK") disks = self.conn.select(azureDiskTable.select(azureDiskTable.c.INSTANCE_NO==instanceNo)) for azureDisk in disks: self.volumecontroller.stopVolume(instanceNo, azureDisk["DISK_NO"]) return
def checkAssociatedAddress(self, instanceNo, addressNo) : # アドレスが関連付けられているかどうかのチェック table = self.conn.getTable("AWS_ADDRESS") awsAddress = self.conn.selectOne(table.select(table.c.ADDRESS_NO==addressNo)) publicIp = awsAddress["PUBLIC_IP"] instanceId = awsAddress["INSTANCE_ID"] address = self.client.describeAddress(publicIp) if isEmpty(address.instanceId): # アドレスがどのインスタンスにも関連付けられていない場合 raise IaasException("EPROCESS-000120", [publicIp, instanceId,]) elif instanceId != address.instanceId: # アドレスが他インスタンスに関連付けられている場合 raise IaasException("EPROCESS-000121", [publicIp, instanceId, address.instanceId,])
def startVolume(self, instanceNo, volumeNo): table = self.conn.getTable('AZURE_DISK') volume = self.conn.selectOne(table.select(table.c.DISK_NO == volumeNo)) # インスタンス名がある場合はスキップ if (isNotEmpty(volume['INSTANCE_NAME'])): return if (isEmpty(volume['DISK_NAME'])): # ボリューム名がない場合は新規作成 self._createAttachVolume(instanceNo, volumeNo) else: # ボリューム名がある場合は既存のデータディスクをアタッチ self._attachVolume(instanceNo, volumeNo) return
def startVolume(self, instanceNo, volumeNo) : table = self.conn.getTable('AZURE_DISK') volume = self.conn.selectOne(table.select(table.c.DISK_NO==volumeNo)) # インスタンス名がある場合はスキップ if (isNotEmpty(volume['INSTANCE_NAME'])) : return if (isEmpty(volume['DISK_NAME'])) : # ボリューム名がない場合は新規作成 self._createAttachVolume(instanceNo, volumeNo) else: # ボリューム名がある場合は既存のデータディスクをアタッチ self._attachVolume(instanceNo, volumeNo) return
def getPasswordData(self, InstanceId): params = {'Action': 'GetPasswordData', 'InstanceId': InstanceId} elem = self.connection.request(self.path, params=params).object #True Falseを受ける passwdData = findattr(element=elem, xpath="passwordData", namespace=NAMESPACE) if isEmpty(passwdData): # パスワードデータを取得できない場合 raise IaasException("EPROCESS-000133", [ InstanceId, ]) return passwdData
def stopInstance(self, instanceNo): #AWS_INSTANCE 取得 tableAWSINS = self.conn.getTable("AWS_INSTANCE") awsInstance = self.conn.selectOne( tableAWSINS.select(tableAWSINS.c.INSTANCE_NO == instanceNo)) # インスタンスIDがない場合はスキップ if (isEmpty(awsInstance["INSTANCE_ID"])): return #PCC_INSTANCE 取得 tableINS = self.conn.getTable("INSTANCE") pccInstance = self.conn.selectOne( tableINS.select(tableINS.c.INSTANCE_NO == instanceNo)) #イメージの取得 再考の余地あり image = getImage(pccInstance["IMAGE_NO"]) # インスタンスイメージの場合 if image["ebsImage"] == "false": try: # インスタンスの削除 self.terminate(instanceNo, awsInstance, pccInstance) # インスタンスの削除待ち self.waitTerminate(instanceNo, pccInstance) except Exception, e: self.logger.error(traceback.format_exc()) # 情報が不整合(インスタンス異常終了時など)の場合、警告ログと後始末のみ行う self.logger.warn(e.massage) updateDict = self.conn.selectOne( tableAWSINS.select( tableAWSINS.c.INSTANCE_NO == instanceNo)) updateDict["INSTANCE_ID"] = None updateDict["STATUS"] = None updateDict["DNS_NAME"] = None updateDict["PRIVATE_DNS_NAME"] = None updateDict["IP_ADDRESS"] = None updateDict["PRIVATE_IP_ADDRESS"] = None sql = tableAWSINS.update( tableAWSINS.c.INSTANCE_NO == updateDict["INSTANCE_NO"], values=updateDict) self.conn.execute(sql)
def startVolume(self, instanceNo, volumeNo) : table = self.conn.getTable("CLOUDSTACK_VOLUME") volume = self.conn.selectOne(table.select(table.c.VOLUME_NO==volumeNo)) # インスタンスIDがある場合はスキップ if (isNotEmpty(volume["INSTANCE_ID"])) : return if (isEmpty(volume["VOLUME_ID"])) : # ボリュームIDがない場合は新規作成 self.createVolume(instanceNo, volumeNo) # ボリュームのアタッチ self.attachVolume(instanceNo, volumeNo) #ディスク認識の為リブート ##self.rebootInstance(instanceNo) #起動スクリプトを待つ time.sleep(10)
def startVolume(self, instanceNo, volumeNo) : table = self.conn.getTable("OPENSTACK_VOLUME") volume = self.conn.selectOne(table.select(table.c.VOLUME_NO==volumeNo)) # インスタンスIDがある場合はスキップ if (isNotEmpty(volume["INSTANCE_ID"])) : return if (isEmpty(volume["VOLUME_ID"])) : # ボリュームIDがない場合は新規作成 self.createVolume(instanceNo, volumeNo) # ボリュームの作成待ち self.waitCreateVolume(instanceNo, volumeNo) # ボリュームのアタッチ self.attachVolume(instanceNo, volumeNo) # ボリュームのアタッチ待ち self.waitAttachVolume(instanceNo, volumeNo)
def terminate(self, instanceId): #CLOUDSTACK_INSTANCE 取得 tableCSINS = self.conn.getTable("CLOUDSTACK_INSTANCE") csInstance = self.conn.selectOne(tableCSINS.select(tableCSINS.c.INSTANCE_ID==instanceId)) if isEmpty(instanceId): #IDが指定されていない場合はそのまま返す return # インスタンスの停止 node = self.client.terminateInstance(instanceId) # ログ出力 self.logger.info(None, "IPROCESS-100604", [instanceId,]) # データベース更新 csInstance["ZONEID"] = None csInstance["STATE"] = node["state"] csInstance["DISPLAYNAME"] = None csInstance["IPADDRESS"] = None sql = tableCSINS.update(tableCSINS.c.INSTANCE_NO ==csInstance["INSTANCE_NO"], values=csInstance) self.conn.execute(sql)
def stopInstance(self, instanceNo): # AWS_INSTANCE 取得 tableAWSINS = self.conn.getTable("AWS_INSTANCE") awsInstance = self.conn.selectOne(tableAWSINS.select(tableAWSINS.c.INSTANCE_NO==instanceNo)) # インスタンスIDがない場合はスキップ if (isEmpty(awsInstance["INSTANCE_ID"])): return; # PCC_INSTANCE 取得 tableINS = self.conn.getTable("INSTANCE") pccInstance = self.conn.selectOne(tableINS.select(tableINS.c.INSTANCE_NO==instanceNo)) # イメージの取得 再考の余地あり image = getImage(pccInstance["IMAGE_NO"]) # インスタンスイメージの場合 if image["ebsImage"]=="false": try : # インスタンスの削除 self.terminate(instanceNo, awsInstance, pccInstance) # インスタンスの削除待ち self.waitTerminate(instanceNo, pccInstance) except Exception, e: self.logger.error(traceback.format_exc()) # 情報が不整合(インスタンス異常終了時など)の場合、警告ログと後始末のみ行う self.logger.warn(e.massage); updateDict = self.conn.selectOne(tableAWSINS.select(tableAWSINS.c.INSTANCE_NO==instanceNo)) updateDict["INSTANCE_ID"] = None updateDict["STATUS"] = None updateDict["DNS_NAME"] = None updateDict["PRIVATE_DNS_NAME"] = None updateDict["IP_ADDRESS"] = None updateDict["PRIVATE_IP_ADDRESS"] = None sql = tableAWSINS.update(tableAWSINS.c.INSTANCE_NO ==updateDict["INSTANCE_NO"], values=updateDict) self.conn.execute(sql)
def terminateInstance(self, instanceNo): self.logger.info(' TerminateInstance: %s' % (instanceNo)) # インスタンスIDの取得 openstackInstanceTable = self.conn.getTable("OPENSTACK_INSTANCE") openstackInstanceInfo = self.conn.selectOne(openstackInstanceTable.select\ (openstackInstanceTable.c.INSTANCE_NO==instanceNo)) openstackInstanceId = openstackInstanceInfo['INSTANCE_ID'] # インスタンス名の取得 instanceTable = self.conn.getTable("INSTANCE") instanceInfo = self.conn.selectOne(instanceTable.select\ (instanceTable.c.INSTANCE_NO==instanceNo)) instanceName = instanceInfo['FQDN'] if isEmpty(openstackInstanceId): # 一度もStartしたことがない raise IaasException("EPROCESS-001009", [instanceName]) # ステータスを確認する try: status = self.client.getVirtualMachineStatus(openstackInstanceId) except: raise IaasException("EPROCESS-001008", [instanceName]) self.logger.info(' Instance: %s, Status: %s' % (instanceName, status)) if status != 'SHUTOFF': # 削除を許さない。 self.logger.error(' Instance: %s cannot be terminated because the status is not SHUTOFF (%s)' % (instanceName, status)) raise IaasException("EPROCESS-001010", [instanceName]) else: self.logger.info(' Terminating Instance: %s' % (instanceName)) try: self.client.deleteVirtualMachine(openstackInstanceId) except: raise IaasException("EPROCESS-001010", [instanceName]) # ステータスは確認しない self.logger.info(' Terminated %s' % (instanceName)) return True
def checkAssociatedAddress(self, instanceNo, addressNo): # アドレスが関連付けられているかどうかのチェック table = self.conn.getTable("AWS_ADDRESS") awsAddress = self.conn.selectOne( table.select(table.c.ADDRESS_NO == addressNo)) publicIp = awsAddress["PUBLIC_IP"] instanceId = awsAddress["INSTANCE_ID"] address = self.client.describeAddress(publicIp) if isEmpty(address.instanceId): # アドレスがどのインスタンスにも関連付けられていない場合 raise IaasException("EPROCESS-000120", [ publicIp, instanceId, ]) elif instanceId != address.instanceId: # アドレスが他インスタンスに関連付けられている場合 raise IaasException("EPROCESS-000121", [ publicIp, instanceId, address.instanceId, ])
def _createVirtualMachine(self, instanceNo, instanceName, instanceInfo, openstackInstanceInfo): # プラットフォーム番号の取得 platformNo = instanceInfo['PLATFORM_NO'] # VM作成に必要なパラメータを取得 # キーペア名 keyName = openstackInstanceInfo['KEY_NAME'] if isEmpty(keyName): self.logger.debug(' No Keipair specified. Using default.') # ファーム番号の取得 farmNo = instanceInfo['FARM_NO'] farmTable = self.conn.getTable("FARM") farmInfo = self.conn.selectOne(farmTable.select\ (farmTable.c.FARM_NO==farmNo)) userNo = farmInfo['USER_NO'] openstackCertificateTable = self.conn.getTable("OPENSTACK_CERTIFICATE") certificateInfo = self.conn.selectOne(openstackCertificateTable.select\ (and_(openstackCertificateTable.c.USER_NO==userNo, \ openstackCertificateTable.c.PLATFORM_NO==platformNo))) keyName = certificateInfo['DEF_KEYPAIR'] self.logger.debug(' Keypair: %s' % (keyName)) # フレーバーID instanceType = openstackInstanceInfo['INSTANCE_TYPE'] self.logger.debug(' Instance Type: %s' % (instanceType)) # セキュリティグループID securityGroup = openstackInstanceInfo['SECURITY_GROUPS'] self.logger.debug(' Security Group: %s' % (securityGroup)) # ゾーンID availabilityZone = openstackInstanceInfo['AVAILABILITY_ZONE'] if isEmpty(availabilityZone): self.logger.debug(' No Availability Zone specified. Using default.') platformOpenStackTable = self.conn.getTable("PLATFORM_OPENSTACK") platformOpenStackInfo = self.conn.selectOne(platformOpenStackTable.select\ (platformOpenStackTable.c.PLATFORM_NO==platformNo)) availabilityZone = platformOpenStackInfo['AVAILABILITY_ZONE'] self.logger.debug(' Availability Zone: %s' % (availabilityZone)) # ネットワークID networkId = openstackInstanceInfo['NETWORK_ID'] if isEmpty(networkId): self.logger.debug(' No Network ID specified. Using default.') platformOpenStackTable = self.conn.getTable("PLATFORM_OPENSTACK") platformOpenStackInfo = self.conn.selectOne(platformOpenStackTable.select\ (platformOpenStackTable.c.PLATFORM_NO==platformNo)) networkId = platformOpenStackInfo['NETWORK_ID'] self.logger.debug(' Network: %s' % (networkId)) # イメージID imageNo = instanceInfo['IMAGE_NO'] imageOpenstackTable = self.conn.getTable("IMAGE_OPENSTACK") imageOpenstackInfo = self.conn.selectOne(imageOpenstackTable.select\ (imageOpenstackTable.c.IMAGE_NO==imageNo)) imageId = imageOpenstackInfo['IMAGE_ID'] self.logger.debug(' Image: %s' % (imageId)) # ユーザデータ userData = self.createUserData(instanceNo, instanceInfo, openstackInstanceInfo) userData = self.makeUserData(userData) self.logger.debug(' User Data: %s' %(userData)) try: instanceObj = self.client.createVirtualMachine(instanceName, instanceType, \ imageId, availabilityZone, networkId, userData, securityGroup, keyName) except: raise IaasException("EPROCESS-001002", [instanceName]) status = instanceObj.status if status != 'ACTIVE': raise IaasException("EPROCESS-001003", [instanceName, status]) openstackInstanceId = instanceObj.id connectedNetworks = instanceObj.addresses.keys() # IPは1つのみであることを仮定 connectedNw = connectedNetworks[0] try: ipAddr = instanceObj.addresses[connectedNw][0]['addr'] self.logger.debug(' IP Address: %s' %(ipAddr)) except: ipAddr = None # データベース更新 table = self.conn.getTable("OPENSTACK_INSTANCE") updateDict = self.conn.selectOne(table.select(table.c.INSTANCE_NO==instanceNo)) updateDict["STATUS"] = status updateDict["INSTANCE_ID"] = openstackInstanceId updateDict["PRIVATE_IP_ADDRESS"] = ipAddr updateDict["NETWORK_ID"] = networkId updateDict["KEY_NAME"] = keyName updateDict["AVAILABILITY_ZONE"] = availabilityZone sql = table.update(table.c.INSTANCE_NO == updateDict["INSTANCE_NO"], values=updateDict) self.conn.execute(sql) return True
def startInstance(self, instanceNo): self.logger.info(' StartInstance: %s' % (instanceNo)) # プラットフォーム番号の取得 instanceTable = self.conn.getTable("INSTANCE") instanceInfo = self.conn.selectOne(instanceTable.select\ (instanceTable.c.INSTANCE_NO==instanceNo)) platformNo = instanceInfo['PLATFORM_NO'] # 仮想マシンの起動実績確認 azureInstanceTable = self.conn.getTable("AZURE_INSTANCE") azureInstanceInfo = self.conn.selectOne(azureInstanceTable.select\ (azureInstanceTable.c.INSTANCE_NO==instanceNo)) # インスタンス名 instanceName = azureInstanceInfo['INSTANCE_NAME'] if isEmpty(instanceName): # 仮想マシンの新規作成 self._createInstance(platformNo, instanceNo) return else: # クラウドサービス名 platformAzureTable = self.conn.getTable("PLATFORM_AZURE") platformAzureInfo = self.conn.selectOne(platformAzureTable.select\ (platformAzureTable.c.PLATFORM_NO==platformNo)) cloudService = platformAzureInfo['CLOUD_SERVICE_NAME'] # 既存仮想マシンの起動 # Azure上に仮想マシンが存在するか確認 status = self.client.getVirtualMachineStatus(cloudService, instanceName) self.logger.info(' Instance: %s, Status: %s' % (instanceName, status)) if status is None: # インスタンスが存在しないまたは、状態取得に失敗した場合は、処理を終了する # ステータスは変更しない raise IaasException("EPROCESS-000914", [instanceName]) elif status == 'ReadyRole': self.logger.info(' Instance %s is already running' % (instanceName)) # インスタンスタイプをチェックし、食い違う場合は警告をログに出力する # インスタンスタイプ instanceType = azureInstanceInfo['INSTANCE_TYPE'] currentInstanceType = self.client.getVirtualMachineType(cloudService, instanceName) if currentInstanceType != instanceType: raise IaasException("EPROCESS-000913", [instanceName]) # Azure上では起動している場合、DBを更新して終了。 pass else: # ReadyRole以外の場合、起動を試みる # インスタンスタイプをチェックし、食い違う場合は警告をログに出力する # インスタンスタイプ instanceType = azureInstanceInfo['INSTANCE_TYPE'] currentInstanceType = self.client.getVirtualMachineType(cloudService, instanceName) if currentInstanceType != instanceType: self.logger.info(' Changing its instance type to %s' % (instanceType)) # サブネット subnetID = azureInstanceInfo['SUBNET_ID'] self.logger.info(' Subnet ID: %s' % (subnetID)) networkConfig = self.client.generateNetworkConfig(subnetID) # 可用性セット availabilitySet = azureInstanceInfo['AVAILABILITY_SET'] self.logger.info(' Availability Set: %s' % (availabilitySet)) # インスタンスタイプの変更を反映 newInstanceType = self.client.updateVirtualMachineType(cloudService, instanceName, instanceType, \ networkConfig, availabilitySet) if isEmpty(newInstanceType): # インスタンスタイプの変更に失敗した場合は、起動も行わない raise IaasException("EPROCESS-000913", [instanceName]) self.logger.info(' Instance type for %s has been updated: %s' % (instanceName, newInstanceType)) # インスタンス起動 status = self.client.startVirtualMachine(cloudService, instanceName) # 異常系テストコード #status = 'None' if status != 'ReadyRole': # VMが起動成功しなかったら、データベースを更新せずに終了 raise IaasException("EPROCESS-000906", [instanceName, status]) # データベース更新 table = self.conn.getTable("AZURE_INSTANCE") updateDict = self.conn.selectOne(table.select(table.c.INSTANCE_NO==instanceNo)) updateDict["STATUS"] = status sql = table.update(table.c.INSTANCE_NO == updateDict["INSTANCE_NO"], values=updateDict) self.conn.execute(sql) return
def startInstance(self, instanceNo): self.logger.info(' StartInstance: %s' % (instanceNo)) # インスタンスIDの取得 openstackInstanceTable = self.conn.getTable("OPENSTACK_INSTANCE") openstackInstanceInfo = self.conn.selectOne(openstackInstanceTable.select\ (openstackInstanceTable.c.INSTANCE_NO==instanceNo)) openstackInstanceId = openstackInstanceInfo['INSTANCE_ID'] # インスタンス名の取得 instanceTable = self.conn.getTable("INSTANCE") instanceInfo = self.conn.selectOne(instanceTable.select\ (instanceTable.c.INSTANCE_NO==instanceNo)) instanceName = instanceInfo['FQDN'] if isEmpty(openstackInstanceId): # 新規作成 self.logger.info(' Creating Instance: %s' % (instanceName)) return self._createVirtualMachine(instanceNo, instanceName, instanceInfo, openstackInstanceInfo) else: # 既存インスタンス # ステータスを確認する try: status = self.client.getVirtualMachineStatus(openstackInstanceId) except: raise IaasException("EPROCESS-001008", [instanceName]) if status == 'ACTIVE': # 既にインスタンスは起動しているため、statusを更新して終了する。 self.logger.info(' Instance: %s is already ACTIVE' % (instanceName)) # データベース更新 table = self.conn.getTable("OPENSTACK_INSTANCE") updateDict = self.conn.selectOne(table.select(table.c.INSTANCE_NO==instanceNo)) updateDict["STATUS"] = status sql = table.update(table.c.INSTANCE_NO == updateDict["INSTANCE_NO"], values=updateDict) self.conn.execute(sql) return True elif status == 'ERROR': # インスタンスの状態がERRORならば、起動は意味がないのでエラーにする。 self.logger.info(' Instance: %s is in ERROR status' % (instanceName)) raise IaasException("EPROCESS-001003", [instanceName, status]) else: # 既に作成され、停止しているインスタンスを起動する。 # SHUTOFF 状態のインスタンスに対して起動するのが通常の処理だが、 # SHUTOFF 状態以外の場合でも、起動を試みて結果を返す。 self.logger.info(' Starting Instance: %s' % (instanceName)) try: instanceObj = self.client.startVirtualMachine(openstackInstanceId) except: raise IaasException("EPROCESS-001004", [instanceName]) status = instanceObj.status self.logger.info(' StartInstance finished. Status: %s' % (status)) if status != 'ACTIVE': raise IaasException("EPROCESS-001003", [instanceName, status]) # データベース更新 table = self.conn.getTable("OPENSTACK_INSTANCE") updateDict = self.conn.selectOne(table.select(table.c.INSTANCE_NO==instanceNo)) updateDict["STATUS"] = status sql = table.update(table.c.INSTANCE_NO == updateDict["INSTANCE_NO"], values=updateDict) self.conn.execute(sql) return True