导航

 
安装sdk
import os
import zipfile
import commands
cmd='cd {};cd ksc-sdk-python-master;{} setup.py install'.format(dst_dir,python_path)
print cmd
res=commands.getstatusoutput(cmd)
if res[0]:
    print res
else:
    print '安装成功!'

  

创建虚拟机
#coding=utf8
from kscore.session import get_session
import re
import sys


def make_conn(service_name, region):
    try:
        s = get_session()
        url = 'http://kec.{}.XXX.XXXX'.format(region)
        if url.startswith('http://'):
            is_ssl = False
        else:
            is_ssl = True
        client = s.create_client(service_name, region_name=region, endpoint_url=url,
                                 use_ssl=is_ssl, ks_access_key_id=ACCESS_KEY_ID,
                                 ks_secret_access_key=SECRET_ACCESS_KEY, api_version='2016-03-04',
                                 verify=False)
        return client
    except Exception as e:
        print e


def create_vm(client,instance_type='I1.1A',password=None,image_id=None,subnet_id=None,
              security_group_id=None,vm_name=None,charge_type="Daily",data_volumn=None,
              project_id=0,max_count=1,suffix=''):
    if password and (len(password)<8 or len(password)>32 or
                         re.match(r'[0-9]+', password) or
                         re.match(r'[a-z]+', password)):
        return False, '密码输入错误:密码规则为最短8字符,最长32字符,必须包含大小写英文字符和数字,支持其他可见字符'

    if not data_volumn:
        data_disk_gb=0
    else:
        data_disk_gb=int(data_volumn.strip())

    #print image_id,subnet_id,password,security_group_id,charge_type,instance_type,vm_name,data_disk_gb
    res = client.run_instances(
        MaxCount=max_count, MinCount=1, ImageId=image_id,
        SubnetId=subnet_id, InstancePassword=str(password),
        SecurityGroupId=security_group_id, ChargeType=charge_type,
        InstanceType=instance_type, PurchaseTime=0, InstanceName=vm_name,
        DataDiskGb=data_disk_gb,ProjectId=project_id,InstanceNameSuffix=suffix)
    vm_id=None
    if res.get('InstancesSet',None) not in ([],None):
        vm_id=[i['InstanceId'] for i in res['InstancesSet']]
    if vm_id:
        return True,vm_id
    else:
        return False,res


def get_vm(client, instances=None,ids=[]):
    if instances:
        instances = dict(("InstanceId.{}".format(index), instance) for index, instance in
                         enumerate(instances, 1))
        res = client.describe_instances(**instances)
    elif ids:
        i=0
        for id in ids:
            instances = {"InstanceId.{}".format(i):id}
            i+=1
        res = client.describe_instances(**instances)
    else:
        res = client.describe_instances()
    return res


if __name__ == '__main__':
    project_id=0
    count=2
    batch=True
    if batch==True:
        suffix='1'
    else:
        suffix=''
    if count<1:
        print '要输入的机器数目错误,必须输入1以上的整数'
        sys.exit(1)
    client = make_conn('kec', region)
    code,vm_id=create_vm(client,password=password,image_id=image_id,subnet_id=subnet_id,
                     security_group_id=security_group_id,vm_name=vm_name,instance_type=instance_type,
                         project_id=project_id,max_count=count,suffix=suffix)
    if not code:
        print vm_id
        sys.exit(1)
    res=get_vm(client,instances=vm_id)
    print res
    instances=res['InstancesSet']
    success=[]
    fail=[]
    while instances!=[]:
        wait=[]
        for instance in instances:
            if instance.get('InstanceState',None) and instance['InstanceState'].get('Name')=='active':
                success.append(instance['InstanceId'])
            elif instance.get('InstanceState',None) and instance['InstanceState'].get('Name')=='error':
                fail.append(instance['InstanceId'])
            else:
                wait.append(instance['InstanceId'])
        if wait==[]:
            break
        else:
            instances = get_vm(client, instances=wait)['InstancesSet']

    if fail and success:
        print '创建完成!创建成功的机器:{}\n创建失败的机器:{}'.format(','.join(success),','.join(fail))
        sys.exit(1)
    elif fail and not success:
        print '创建失败!创建失败的机器:{}'.format(','.join(fail))
        sys.exit(1)
    elif not fail and success:
        print '创建成功!创建成功的机器:{}'.format(','.join(success))

  

删除虚拟机
#coding=utf8
from kscore.session import get_session
import re


def make_conn(service_name, region):
    try:
        s = get_session()
        url = 'http://kec.{}.XXx.XXX'.format(region)
        if url.startswith('http://'):
            is_ssl = False
        else:
            is_ssl = True
        client = s.create_client(service_name, region_name=region, endpoint_url=url,
                                 use_ssl=is_ssl, ks_access_key_id=ACCESS_KEY_ID,
                                 ks_secret_access_key=SECRET_ACCESS_KEY, api_version='2016-03-04',
                                 verify=False)
        return client
    except Exception as e:
        print e


def get_vm(client, instances=None):
    if instances:
        instances = dict(("InstanceId.{}".format(index), instance) for index, instance in
                         enumerate(instances, 1))
        res = client.describe_instances(**instances)
    else:
        res = client.describe_instances()
    return res


def del_vms(client,instances=None):
    res=get_vm(client, instances=instances)
    temp=[]
    fail = []
    print res
    if res['InstanceCount']!=len(instances):
        for i in res['InstancesSet']:
            temp.append(i['InstanceId'])

        for i in temp:
            if i not in instances:
                fail.append(i)
        instances=temp
    # print fail
    # print instances
    if instances:
        instances = dict(
            ("InstanceId.{}".format(index), instance) for index, instance in enumerate(instances, 1))

        res=client.terminate_instances(**instances)
        if res.get('InstancesSet',None) :
            for i in res['InstancesSet']:
                if i.get('Return',None)!=True:
                    fail.append(i['InstanceId'])
    if fail:
        return '删除失败,失败的id为:{}'.format(','.join(fail))
    else:
        return '删除成功'


def get_vm_by_name(client,names=[],project=0):
    result=[]
    for i in names:
        instances={"InstanceName":i}#$,"MaxResults":1000}
        res = client.describe_instances(**instances)
        if res.get('InstancesSet',None):
            for i in res['InstancesSet']:
                if i['ProjectId']==project:
                    result.append(i['InstanceId'])
    return result



if __name__ == '__main__':
    client = make_conn('kec', region)
    # print client
    names=['test-1','test-2']
    project_id=0
    instances=''
    if vm_name:
        for name in vm_name.split(','):
            names.append(name)
        instances=get_vm_by_name(client,names=names,project=project_id)
    #print instances
    elif instances:
        instances=instances.split(',')
    res = del_vms(client, instances=instances)
    print res

  

posted on 2019-05-22 17:43  slqt  阅读(268)  评论(0编辑  收藏  举报