def enable_vsan_vmknic(si, vmkernel_nic, cluster):
    tasks=[]
    # Update configuration spec for VMkernel networking
    configInfo = vim.vsan.host.ConfigInfo(
        networkInfo=vim.vsan.host.ConfigInfo.NetworkInfo(port=[
            vim.vsan.host.ConfigInfo.NetworkInfo.PortConfig(device=vmkernel_nic)
        ]))

    # Enumerate the selected VMkernel adapter for each host and add it to the list of tasks
    hostProps = CollectMultiple(si.content, cluster.host,
                                ['name', 'configManager.vsanSystem', 'configManager.storageSystem'])
    hosts = hostProps.keys()

    for host in hosts:
        print('Enable vSAN traffic on host {} with {}'.format(hostProps[host]['name'], vmkernel_nic))
        task = hostProps[host]['configManager.vsanSystem'].UpdateVsan_Task(configInfo)
        wait_for_task(task)

    # Can make this faster by running tasks concurrently see below scratch code
    #tasks.append(task)
    # Execute the tasks
    #vsanapiutils.WaitForTasks(tasks, si)

    # Build vsanReconfigSpec step by step. It takes effect only after calling the VsanClusterReconfig method
    clusterConfig = vim.VsanClusterConfigInfo(enabled=True)
    vsanReconfigSpec = vim.VimVsanReconfigSpec(
        modify=True, vsanClusterConfig=clusterConfig)
Exemplo n.º 2
0
def main():
    args = GetArgs()
    if args.password:
        password = args.password
    else:
        password = getpass.getpass(prompt='Enter password for host %s and '
                                   'user %s: ' % (args.host, args.user))

    #For python 2.7.9 and later, the defaul SSL conext has more strict
    #connection handshaking rule. We may need turn of the hostname checking
    #and client side cert verification
    context = None
    if sys.version_info[:3] > (2, 7, 8):
        context = ssl.create_default_context()
        context.check_hostname = False
        context.verify_mode = ssl.CERT_NONE

    # Disabling the annoying InsecureRequestWarning message
    requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

    si = SmartConnect(host=args.host,
                      user=args.user,
                      pwd=password,
                      port=int(args.port),
                      sslContext=context)

    atexit.register(Disconnect, si)

    #for detecting whether the host is VC or ESXi
    aboutInfo = si.content.about

    if aboutInfo.apiType == 'VirtualCenter':
        majorApiVersion = aboutInfo.apiVersion.split('.')[0]
        if int(majorApiVersion) < 6:
            print(
                'The Virtual Center with version %s (lower than 6.0) is not supported.'
                % aboutInfo.apiVersion)
            return -1

        #Here is an example of how to access VC side VSAN Health Service API
        vcMos = vsanapiutils.GetVsanVcMos(si._stub, context=context)

        # Get VSAN Cluster Config System
        vccs = vcMos['vsan-cluster-config-system']

        cluster = getClusterInstance(args.clusterName, si)

        if cluster is None:
            print("Cluster %s is not found for %s" %
                  (args.clusterName, args.host))
            return -1

        # Check to see if Automatic Claiming is enabled, if so, we need to disable else we can continue
        vsanCluster = vccs.VsanClusterGetConfig(cluster=cluster)

        if (vsanCluster.defaultConfig.autoClaimStorage == True):
            print("Disabling Automatic Claiming on VSAN Cluster: %s" %
                  args.clusterName)
            vsanSpec = vim.VimVsanReconfigSpec(
                vsanClusterConfig=vim.VsanClusterConfigInfo(
                    defaultConfig=vim.VsanClusterConfigInfoHostDefaultInfo(
                        autoClaimStorage=False)),
                modify=True)
            vsanTask = vccs.VsanClusterReconfig(cluster=cluster,
                                                vsanReconfigSpec=vsanSpec)
            vcTask = vsanapiutils.ConvertVsanTaskToVcTask(vsanTask, si._stub)
            vsanapiutils.WaitForTasks([vcTask], si)

        # Check to see if Dedupe & Compression is already enabled, if not, then we'll enable it
        if (vsanCluster.dataEfficiencyConfig.compressionEnabled == False
                or vsanCluster.dataEfficiencyConfig.dedupEnabled == False):
            print(
                "Enabling Compression/Dedupe capability on VSAN Cluster: %s" %
                args.clusterName)
            # Create new VSAN Reconfig Spec, both Compression/Dedupe must be enabled together
            vsanSpec = vim.VimVsanReconfigSpec(
                dataEfficiencyConfig=vim.VsanDataEfficiencyConfig(
                    compressionEnabled=True, dedupEnabled=True),
                modify=True)
            vsanTask = vccs.VsanClusterReconfig(cluster=cluster,
                                                vsanReconfigSpec=vsanSpec)
            vcTask = vsanapiutils.ConvertVsanTaskToVcTask(vsanTask, si._stub)
            vsanapiutils.WaitForTasks([vcTask], si)
        else:
            print("Compression/Dedupe is already enabled on VSAN Cluster: %s" %
                  args.clusterName)
def main():
    # TEMP DEBUG
    print("Inputs for program are: ")
    for i in inputs:
        print("    ", i, inputs[i])
        if inputs[i] == None:
            print("Missing a required value for ",  i)

    try:
        si = None
        try:
            print("Trying to connect to VCENTER SERVER . . .")
            si = connect.SmartConnectNoSSL('https', inputs['vcenter_ip'], 443, inputs['vcenter_user'], inputs['vcenter_password'])
        except IOError as e:
            pass
            atexit.register(Disconnect, si)

        print("Connected to VCENTER SERVER !")
        content = si.RetrieveContent()
        cluster = get_obj(content, [vim.ClusterComputeResource], inputs['cluster'])
        print("Cluster Name is ",cluster.name)

        # Configure vmkernel adapter on all hosts for vSAN
        vmkernel_nic = "vmk0"
        enable_vsan_vmknic(si, vmkernel_nic, cluster)



        ## From https://github.com/storage-code/vsanDeploy/blob/master/vsanDeploy.py
        context = None
        context = ssl.create_default_context()
        context.check_hostname = False
        context.verify_mode = ssl.CERT_NONE

        vcMos = vsanapiutils.GetVsanVcMos(si._stub, context=context)

        vsanClusterSystem = vcMos['vsan-cluster-config-system']
        vsanVcDiskManagementSystem = vcMos['vsan-disk-management-system']

        # Build vsanReconfigSpec step by step, it only take effect after method VsanClusterReconfig is called
        vsanReconfigSpec = vim.VimVsanReconfigSpec(
            modify=True,
            vsanClusterConfig=vim.VsanClusterConfigInfo(
                enabled=True,
                defaultConfig=vim.VsanClusterConfigInfoHostDefaultInfo(
                    autoClaimStorage=True
                )
            )
        )

        print('Disable deduplication and compression for VSAN')
        vsanReconfigSpec.dataEfficiencyConfig = vim.VsanDataEfficiencyConfig(
            compressionEnabled=False,
            dedupEnabled=False)

        task = vsanClusterSystem.VsanClusterReconfig(cluster, vsanReconfigSpec)
        wait_for_task(task)

        '''
        print("Configuring HCI for cluster %s ..." % cluster.name)
        hciCfgs = []
        for mo in cluster.host:
            hciCfg = vim.ClusterComputeResource.HostConfigurationInput()
            hciCfg.host = mo
            hciCfgs.append(hciCfg)

        lockdownMode = vim.host.HostAccessManager.LockdownMode.lockdownDisabled
        NTP_SERVER = "time-c-b.nist.gov"
        hostConfigProfile = CreateHostConfigProfile(NTP_SERVER, lockdownMode)
        vSanCfgInfo = vim.vsan.cluster.ConfigInfo(
            enabled=True,
            defaultConfig=vim.vsan.cluster.ConfigInfo.HostDefaultInfo(
                autoClaimStorage=False))
        print("vSanCfgInfo Set successfully ", vSanCfgInfo)
        vSanSpec = CreateDefaultVSanSpec(vSanCfgInfo)
        print("CreateDefaultVSanSpec successfully ", vSanSpec)

        #vcProf = GetVcProf()
        #dvsProfiles = GetDvsProfiles(cluster.host)
        clusterHciSpec = vim.ClusterComputeResource.HCIConfigSpec(
            hostConfigProfile=hostConfigProfile,
            vSanConfigSpec=vSanSpec)

        task = cluster.ConfigureHCI_Task(clusterSpec=clusterHciSpec, \
                                         hostInputs=hciCfgs)
        wait_for_task(task)
        print("Successfully configured HCI cluster %s" % clusterName)
        '''

    except vmodl.MethodFault as e:
        print("Caught vmodl fault: %s" % e.msg)
        return 1
    except Exception as e:
        print("Caught exception: %s" % str(e))
        return 1
Exemplo n.º 4
0
def main():
    args = GetArgs()
    if args.password:
        password = args.password
    else:
        password = getpass.getpass(prompt='Enter password for host %s and '
                                   'user %s: ' % (args.host, args.user))

    # For python 2.7.9 and later, the defaul SSL conext has more strict
    # connection handshaking rule. We may need turn of the hostname checking
    # and client side cert verification
    context = None
    if sys.version_info[:3] > (2, 7, 8):
        context = ssl.create_default_context()
        context.check_hostname = False
        context.verify_mode = ssl.CERT_NONE

    si = SmartConnect(host=args.host,
                      user=args.user,
                      pwd=password,
                      port=int(args.port),
                      sslContext=context)

    atexit.register(Disconnect, si)

    cluster = getClusterInstance(args.clusterName, si)

    if args.vsanlicense:
        print 'Assign VSAN license'
        lm = si.content.licenseManager
        lam = lm.licenseAssignmentManager
        lam.UpdateAssignedLicense(entity=cluster._moId,
                                  licenseKey=args.vsanlicense)

    vcMos = vsanapiutils.GetVsanVcMos(si._stub, context=context)

    vsanClusterSystem = vcMos['vsan-cluster-config-system']
    vsanVcDiskManagementSystem = vcMos['vsan-disk-management-system']

    isallFlash = args.allflash

    print 'Enable VSAN with {} mode'.format(
        'all flash ' if isallFlash else 'hybrid')

    hostProps = CollectMultiple(
        si.content, cluster.host,
        ['name', 'configManager.vsanSystem', 'configManager.storageSystem'])
    hosts = hostProps.keys()

    for host in hosts:
        disks = [
            result.disk for result in hostProps[host]
            ['configManager.vsanSystem'].QueryDisksForVsan()
            if result.state == 'ineligible'
        ]
        print 'Find ineligible disks {} in host {}'.format(
            [disk.displayName for disk in disks], hostProps[host]['name'])
        for disk in disks:
            if yes('Do you want to wipe disk {}?\nPlease Always check the partition table and the data stored'
                   ' on those disks before doing any wipe! (yes/no)?'.format(
                       disk.displayName)):
                hostProps[host][
                    'configManager.storageSystem'].UpdateDiskPartitions(
                        disk.deviceName, vim.HostDiskPartitionSpec())

    tasks = []

    configInfo = vim.VsanHostConfigInfo(
        networkInfo=vim.VsanHostConfigInfoNetworkInfo(port=[
            vim.VsanHostConfigInfoNetworkInfoPortConfig(
                device=args.vmknic,
                ipConfig=vim.VsanHostIpConfig(upstreamIpAddress='224.1.2.3',
                                              downstreamIpAddress='224.2.3.4'))
        ]))

    for host in hosts:
        print 'Enable VSAN trafic in host {} with {}'.format(
            hostProps[host]['name'], args.vmknic)
        task = hostProps[host]['configManager.vsanSystem'].UpdateVsan_Task(
            configInfo)
        tasks.append(task)
    vsanapiutils.WaitForTasks(tasks, si)
    del tasks[:]

    print 'Enable VSAN by claiming disks manually'
    #Build vsanReconfigSpec step by step, it only take effect after method VsanClusterReconfig is called
    vsanReconfigSpec = vim.VimVsanReconfigSpec(
        modify=True,
        vsanClusterConfig=vim.VsanClusterConfigInfo(
            enabled=True,
            defaultConfig=vim.VsanClusterConfigInfoHostDefaultInfo(
                autoClaimStorage=False)))

    if isallFlash:
        print 'Enable deduplication and compression for VSAN'
        vsanReconfigSpec.dataEfficiencyConfig = vim.VsanDataEfficiencyConfig(
            compressionEnabled=True, dedupEnabled=True)

    if args.faultdomains:
        print 'Add fault domains in vsan'
        faultDomains = []
        #args.faultdomains is a string like f1:host1,host2 f2:host3,host4
        for faultdomain in args.faultdomains.split():
            fname, hostnames = faultdomain.split(':')
            domainSpec = vim.cluster.VsanFaultDomainSpec(
                name=fname,
                hosts=[
                    host for host in hosts
                    if hostProps[host]['name'] in hostnames.split(',')
                ])
            faultDomains.append(domainSpec)

        vsanReconfigSpec.faultDomainsSpec = vim.VimClusterVsanFaultDomainsConfigSpec(
            faultDomains=faultDomains)

    task = vsanClusterSystem.VsanClusterReconfig(cluster, vsanReconfigSpec)
    vsanapiutils.WaitForTasks([task], si)

    diskmap = {host: {'cache': [], 'capacity': []} for host in hosts}
    cacheDisks = []
    capacityDisks = []

    if isallFlash:
        #Get eligible ssd from host
        for host in hosts:
            ssds = [
                result.disk for result in hostProps[host]
                ['configManager.vsanSystem'].QueryDisksForVsan()
                if result.state == 'eligible' and result.disk.ssd
            ]
            smallerSize = min([
                disk.capacity.block * disk.capacity.blockSize for disk in ssds
            ])
            for ssd in ssds:
                size = ssd.capacity.block * ssd.capacity.blockSize
                if size == smallerSize:
                    diskmap[host]['cache'].append(ssd)
                    cacheDisks.append((ssd.displayName, sizeof_fmt(size),
                                       hostProps[host]['name']))
                else:
                    diskmap[host]['capacity'].append(ssd)
                    capacityDisks.append((ssd.displayName, sizeof_fmt(size),
                                          hostProps[host]['name']))
    else:
        for host in hosts:
            disks = [
                result.disk for result in hostProps[host]
                ['configManager.vsanSystem'].QueryDisksForVsan()
                if result.state == 'eligible'
            ]
            ssds = [disk for disk in disks if disk.ssd]
            hdds = [disk for disk in disks if not disk.ssd]

            for disk in ssds:
                diskmap[host]['cache'].append(disk)
                size = disk.capacity.block * disk.capacity.blockSize
                cacheDisks.append((disk.displayName, sizeof_fmt(size),
                                   hostProps[host]['name']))
            for disk in hdds:
                diskmap[host]['capacity'].append(disk)
                size = disk.capacity.block * disk.capacity.blockSize
                capacityDisks.append((disk.displayName, sizeof_fmt(size),
                                      hostProps[host]['name']))

    print 'Claim these disks to cache disks'
    for disk in cacheDisks:
        print 'Name:{}, Size:{}, Host:{}'.format(disk[0], disk[1], disk[2])

    print 'Claim these disks to capacity disks'
    for disk in capacityDisks:
        print 'Name:{}, Size:{}, Host:{}'.format(disk[0], disk[1], disk[2])

    for host, disks in diskmap.iteritems():
        if disks['cache'] and disks['capacity']:
            dm = vim.VimVsanHostDiskMappingCreationSpec(
                cacheDisks=disks['cache'],
                capacityDisks=disks['capacity'],
                creationType='allFlash' if isallFlash else 'hybrid',
                host=host)

            task = vsanVcDiskManagementSystem.InitializeDiskMappings(dm)
            tasks.append(task)

    print 'Wait for create disk group tasks finish'
    vsanapiutils.WaitForTasks(tasks, si)
    del tasks[:]

    print 'Display disk groups in each host'
    for host in hosts:
        diskMaps = vsanVcDiskManagementSystem.QueryDiskMappings(host)

        for index, diskMap in enumerate(diskMaps, 1):
            print 'Host:{}, DiskGroup:{}, Cache Disks:{}, Capacity Disks:{}'.format(
                hostProps[host]['name'], index,
                diskMap.mapping.ssd.displayName,
                [disk.displayName for disk in diskMap.mapping.nonSsd])

    print 'Enable perf service on this cluster'
    vsanPerfSystem = vcMos['vsan-performance-manager']
    task = vsanPerfSystem.CreateStatsObjectTask(cluster)
    vsanapiutils.WaitForTasks([task], si)