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)
Example #2
0
    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
Example #5
0
    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)
Example #7
0
    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;
Example #9
0
    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)
Example #10
0
    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)
Example #11
0
    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"])
Example #14
0
    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
Example #23
0
    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)
Example #25
0
    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)
Example #26
0
    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)
Example #27
0
    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
Example #30
0
    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