Esempio n. 1
0
    def create_instance(
        self,
        instance_type,
        image_id,
        tags,
        key_pair_name,
        optimized="optimized",
        instance_charge_type="PostPaid",
        spot_strategy="SpotWithPriceLimit",
        internet_charge_type="PayByTraffic",
        internet_max_bandwidth_out=5,
    ):
        """ Create a subscription or pay-as-you-go ECS instance.

        :param instance_type: The instance type of the ECS.
        :param image_id: The ID of the image used to create the instance.
        :param tags: The tags of the instance.
        :param key_pair_name: The name of the key pair to be bound to
                              the instance.
        :param optimized: Specifies whether the instance is I/O optimized
        :param instance_charge_type: The billing method of the instance.
                                     Default value: PostPaid.
        :param spot_strategy: The preemption policy for the pay-as-you-go
                              instance.
        :param internet_charge_type: The billing method for network usage.
                                     Default value: PayByTraffic.
        :param internet_max_bandwidth_out: The maximum inbound public
                                           bandwidth. Unit: Mbit/s.
        :return: The created instance ID.
        """
        request = CreateInstanceRequest()
        request.set_InstanceType(instance_type)
        request.set_ImageId(image_id)
        request.set_IoOptimized(optimized)
        request.set_InstanceChargeType(instance_charge_type)
        request.set_SpotStrategy(spot_strategy)
        request.set_InternetChargeType(internet_charge_type)
        request.set_InternetMaxBandwidthOut(internet_max_bandwidth_out)
        request.set_KeyPairName(key_pair_name)
        request.set_Tags(tags)

        response = self._send_request(request)
        if response is not None:
            instance_id = response.get("InstanceId")
            logging.info("instance %s created task submit successfully.",
                         instance_id)
            return instance_id
        logging.error("instance created failed.")
        return None
Esempio n. 2
0
    def createInstance(self):
        ret = {}
        clt = self.createECS_Client()
        request = CreateInstanceRequest()
        request.set_ImageId(self.imageID)
        request.set_InstanceType(self.instanceType)
        request.set_SecurityGroupId(self.groupID)
        request.set_SpotPriceLimit(float(self.price))
        request.set_KeyPairName(self.keyName)
        request.set_InternetMaxBandwidthOut(int(self.bandwidth))
        request.set_IoOptimized('optimized')
        request.set_SystemDiskCategory('cloud_efficiency')
        request.set_InstanceChargeType('PostPaid')
        request.set_SpotStrategy('SpotWithPriceLimit')
        request.set_InternetChargeType('PayByTraffic')
        request.set_VSwitchId(self.vSwitchID)
        """步骤
        1. 创建 ECS
        2. 创建 EIP(暂时废弃)
        3. 启动 ECS
        4. 关联 EIP 到 ECS(暂时废弃)
        """

        response = self._send_request(clt, request)
        if response['code'] != 0:
            logger.warn("create instance failed with %s" % response['msg'])
            return response
        logger.info("create ecs done.")

        instanceID = response['msg'].get('InstanceId')
        associateID = ""
        """ 申请公网 IP
        if self.assoID != "" and self.eip != "":
            logger.debug("use existed eip to asso the ecs.")
            ret['EipAddress'] = self.eip
            associateID = self.assoID
        else:
            response = self.allocEIP(clt)
            if response['code'] != 0:
                logger.warn("alloc EIP failed with %s" % response['msg'])
                return response
            logger.info("alloc EIP response done.")
            ret['EipAddress'] = response['msg']['EipAddress']
            associateID = response['msg']['AllocationId']
        """

        while True:
            response = self.startInstance(clt, instanceID)
            if response['code'] == 0:
                logger.debug("start instance OK, return %s" % response['msg'])
                break
            logger.debug("response code: %s", str(response['code']))
            if response['code'] != 'IncorrectInstanceStatus':
                logger.error("start instance failed with %s" % response['msg'])
                ret['code'] = 1
                ret['msg'] = "start instance failed with" + str(
                    response['msg'])
                return ret
            logger.warn("start instance failed with IncorrectInstanceStatus")
            time.sleep(1)
        logger.debug("start instance done.")
        """关联公网 IP 到 ECS 上
        while True:
            response = self.associateEIP(clt, associateID, instanceID)
            if response['code'] == 0:
                logger.info("associateEIP OK, response: %s" % response['msg'])
                break
            if response['msg']['Code'] != "IncorrectInstanceStatus":
                logger.error("associateEIP failed with %s" % response['msg'])
                return response
            logger.warn("start instance failed with IncorrectInstanceStatus")
            time.sleep(1)
        logger.info("associateEIP done.")
        """

        response = self.getInstanceDetail(clt, instanceID)
        logger.info(response)

        ret['LockReason'] = ''
        lock_reason = response['msg'].get('Instances').get('Instance')[0].get(
            'OperationLocks').get('LockReason')
        if lock_reason is not None:
            for reason in lock_reason:
                if reason == "Recycling":
                    ret['LockReason'] = 'Recycling'
                    break

        ret['InstanceID'] = instanceID
        ret['ExpiredTime'] = response['msg'].get('Instances').get(
            'Instance')[0].get('ExpiredTime')
        ret['EipAddress'] = response['msg'].get('Instances').get(
            'Instance')[0].get('EipAddress').get('IpAddress')
        ret['Hostname'] = response['msg'].get('Instances').get(
            'Instance')[0].get('HostName')
        ret['InnerAddress'] = response['msg'].get('Instances').get('Instance')[
            0].get('VpcAttributes').get('PrivateIpAddress').get('IpAddress')[0]
        ret['msg'] = "Create ECS successfully."
        ret['code'] = 0
        logger.info(ret)
        return ret