예제 #1
0
    def test_0060_detach_disk_from_vm_in_vapp(self):
        """Test the  method vapp.detach_disk_to_vm().

        Invoke the method for the second independent disk, detach it from the
        first vm of the vApp created during setup. We need to power down the
        vm before running this test, and power it back on once the test
        is over.

        This test passes if the disk detachment task succeeds.
        """
        vdc = Environment.get_test_vdc(TestDisk._client)
        vapp = VApp(TestDisk._client, href=TestDisk._test_vapp_href)
        vm_name = TestDisk._test_vapp_first_vm_name
        disk = vdc.get_disk(disk_id=TestDisk._idisk2_id)

        # vm needs to be powered off for detach to succeed.
        is_vapp_powered_on_before_test = vapp.is_powered_on()
        if is_vapp_powered_on_before_test:
            task = vapp.power_off()
            TestDisk._client.get_task_monitor().wait_for_success(task=task)

        vapp.reload()
        task = vapp.detach_disk_from_vm(disk_href=disk.get('href'),
                                        vm_name=vm_name)
        TestDisk._client.get_task_monitor().wait_for_success(task=task)

        vapp.reload()
        # restore vApp to powered on state (if required)
        if is_vapp_powered_on_before_test:
            task = vapp.power_on()
            TestDisk._client.get_task_monitor().wait_for_success(task=task)
예제 #2
0
    def power_on(self):
        vapp_name = self.params.get('vapp_name')
        response = dict()
        response['changed'] = False

        vapp = self.get_vapp()
        try:
            if not vapp.is_powered_on():
                vapp_resource = self.vdc.get_vapp(vapp_name)
                vapp = VApp(self.client,
                            name=vapp_name,
                            resource=vapp_resource)
                power_on_vapp_task = vapp.power_on()
                self.execute_task(power_on_vapp_task)
                response['msg'] = 'Vapp {} has been powered on.'.format(
                    vapp_name)
                response['changed'] = True
            else:
                response['warnings'] = 'Vapp {} is already powered on.'.format(
                    vapp_name)
        except OperationNotSupportedException:
            response[
                'warnings'] = 'Operation is not supported. You may have no VM(s) in {}'.format(
                    vapp_name)

        return response
예제 #3
0
def power_on(ctx, name):
    try:
        client = ctx.obj['client']
        vdc_href = ctx.obj['profiles'].get('vdc_href')
        vdc = VDC(client, href=vdc_href)
        vapp_resource = vdc.get_vapp(name)
        vapp = VApp(client, resource=vapp_resource)
        task = vapp.power_on()
        stdout(task, ctx)
    except Exception as e:
        stderr(e, ctx)
예제 #4
0
    def test_0070_upgrade_virtual_hardware(self):
        vapp_obj = VApp(VAppTest._client, href=VAppTest._test_vapp)
        self._power_off_and_undeploy(vapp_obj)
        result = VAppTest._runner.invoke(
            vapp, args=['upgrade-virtual-hardware', VAppTest._test_vapp_name])
        self.assertEqual(0, result.exit_code)

        result = VAppTest._runner.invoke(
            vapp, args=['deploy', VAppTest._test_vapp_name])
        self.assertEqual(0, result.exit_code)
        vapp_obj.reload()
        task = vapp_obj.power_on()
        VAppTest._client.get_task_monitor().wait_for_success(task)
def update(client, context, vappInfo):
    logging.info("__INIT__update[Vapp]")

    cresult = vapp_pb2.UpdateVAppResult()
    cresult.updated = False

    print("Vapp[ {0} ], Vdc[ {1} ]".format(vappInfo.name, vappInfo.vdc))

    org_resource = client.get_org()
    org = Org(client, resource=org_resource)
    try:
        vdc_resource = org.get_vdc(vappInfo.vdc)
        vdc = VDC(client, name=vappInfo.vdc, resource=vdc_resource)
        vapp_resource = vdc.get_vapp(vappInfo.name)
        vapp = VApp(client, name=vappInfo.name, resource=vapp_resource)
        resp = None
        if (vappInfo.power_on == True):
            logging.info("Powering on [Vapp %v]".format(vappInfo.name))
            resp = vapp.power_on()
        else:
            logging.info("Powering off [Vapp %v]".format(vappInfo.name))
            resp = vapp.undeploy()

        task = client.get_task_monitor().wait_for_status(
            task=resp,
            timeout=60,
            poll_frequency=2,
            fail_on_statuses=None,
            expected_target_statuses=[
                TaskStatus.SUCCESS, TaskStatus.ABORTED, TaskStatus.ERROR,
                TaskStatus.CANCELED
            ],
            callback=None)

        st = task.get('status')
        if st == TaskStatus.SUCCESS.value:
            message = 'status : {0} '.format(st)
            logging.info(message)
            cresult.updated = True
        else:
            raise errors.VappUpdateError(
                etree.tostring(task, pretty_print=True))
    except Exception as e:
        error_message = '__ERROR_updating [Vapp] power_on={0} for Vapp {1} . __ErrorMessage__ {2}'.format(
            vappInfo.power_on, vappInfo.name, str(e))
        logging.warn(error_message)
        cresult.updated = False
        context.set_code(grpc.StatusCode.INVALID_ARGUMENT)
        context.set_details(error_message)
    logging.info("__DONE__update[Vapp]")
    return cresult
def update(client, context, vappInfo):
    logging.info("__INIT__update[Vapp]")

    cresult = vapp_pb2.UpdateVAppResult()
    cresult.updated = False

    print("Vapp[ {0} ], Vdc[ {1} ]".format(vappInfo.name, vappInfo.vdc))

    org_resource = client.get_org()
    org = Org(client, resource=org_resource)
    try:
        vdc_resource = org.get_vdc(vappInfo.vdc)
        vdc = VDC(client, name=vappInfo.vdc, resource=vdc_resource)
        vapp_resource = vdc.get_vapp(vappInfo.name)
        vapp = VApp(client, name=vappInfo.name, resource=vapp_resource)
        resp = None
        if (vappInfo.power_on == True):
            logging.info("Powering on [Vapp %v]".format(vappInfo.name))
            resp = vapp.power_on()
        else:
            logging.info("Powering off [Vapp %v]".format(vappInfo.name))
            resp = vapp.undeploy()

        task = client.get_task_monitor().wait_for_status(
            task=resp,
            timeout=60,
            poll_frequency=2,
            fail_on_statuses=None,
            expected_target_statuses=[
                TaskStatus.SUCCESS, TaskStatus.ABORTED, TaskStatus.ERROR,
                TaskStatus.CANCELED
            ],
            callback=None)

        st = task.get('status')
        if st == TaskStatus.SUCCESS.value:
            message = 'status : {0} '.format(st)
            logging.info(message)
            cresult.updated = True
        else:
            raise errors.VappUpdateError(
                etree.tostring(task, pretty_print=True))
    except Exception as e:
        error_message = '__ERROR_updating [Vapp] power_on={0} for Vapp {1} . __ErrorMessage__ {2}'.format(
            vappInfo.power_on, vappInfo.name, str(e))
        logging.warn(error_message)
        cresult.updated = False
        context.set_code(grpc.StatusCode.INVALID_ARGUMENT)
        context.set_details(error_message)
    logging.info("__DONE__update[Vapp]")
    return cresult
    def power_on(self):
        vapp_name = self.params.get('vapp_name')
        response = dict()
        response['changed'] = False

        try:
            vapp_resource = self.vdc.get_vapp(vapp_name)
            vapp = VApp(self.client, name=vapp_name, resource=vapp_resource)
            power_on_vapp_task = vapp.power_on()
            self.execute_task(power_on_vapp_task)
            response['msg'] = 'Vapp {} has been powered on.'.format(vapp_name)
            response['changed'] = True
        except OperationNotSupportedException:
            response['warnings'] = 'Vapp {} is already powered on.'.format(vapp_name)

        return response
    def power_on(self):
        params = self.module.params
        client = self.module.client
        vdc_name = params.get('vdc')
        vapp_name = params.get('name')
        response = dict()

        vdc = self.get_vdc_object(vdc_name)
        vapp_resource = vdc.get_vapp(vapp_name)
        vapp = VApp(client, name=vapp_name, resource=vapp_resource)
        power_on_vapp_task = vapp.power_on()
        self.execute_task(power_on_vapp_task)
        response['msg'] = 'Vapp {} has been powered on.'.format(vapp_name)
        response['changed'] = True

        return response
예제 #9
0
    def power_on(self):
        vapp_name = self.params.get('vapp_name')
        response = dict()
        response['changed'] = False

        try:
            vapp_resource = self.vdc.get_vapp(vapp_name)
            vapp = VApp(self.client, name=vapp_name, resource=vapp_resource)
            power_on_vapp_task = vapp.power_on()
            self.execute_task(power_on_vapp_task)
            response['msg'] = 'Vapp {} has been powered on.'.format(vapp_name)
            response['changed'] = True
        except OperationNotSupportedException:
            response['warnings'] = 'Vapp {} is already powered on.'.format(
                vapp_name)

        return response
예제 #10
0
def power_on(ctx, name, vm_names):
    try:
        client = ctx.obj['client']
        vdc_href = ctx.obj['profiles'].get('vdc_href')
        vdc = VDC(client, href=vdc_href)
        vapp_resource = vdc.get_vapp(name)
        vapp = VApp(client, resource=vapp_resource)
        if len(vm_names) == 0:
            task = vapp.power_on()
            stdout(task, ctx)
        else:
            for vm_name in vm_names:
                vm = VM(client, resource=vapp.get_vm(vm_name))
                task = vm.power_on()
                stdout(task, ctx)
        stdout(task, ctx)
    except Exception as e:
        stderr(e, ctx)
예제 #11
0
 def test_0060_download_ova(self):
     vapp_obj = VApp(VAppTest._client, href=VAppTest._test_vapp)
     self._power_off_and_undeploy(vapp_obj)
     result = VAppTest._runner.invoke(
         vapp,
         args=[
             'download', VAppTest._test_vapp_name, VAppTest._ova_file_name,
             '-o'
         ])
     self.assertEqual(0, result.exit_code)
     result = VAppTest._runner.invoke(
         vapp, args=['deploy', VAppTest._test_vapp_name])
     self.assertEqual(0, result.exit_code)
     vapp_obj.reload()
     task = vapp_obj.power_on()
     VAppTest._client.get_task_monitor().wait_for_success(task)
     # Remove downloaded vapp file
     os.remove(VAppTest._ova_file_name)
예제 #12
0
파일: vapp.py 프로젝트: vmware/vca-cli
def power_on(ctx, name, vm_names):
    try:
        restore_session(ctx, vdc_required=True)
        client = ctx.obj['client']
        vdc_href = ctx.obj['profiles'].get('vdc_href')
        vdc = VDC(client, href=vdc_href)
        vapp_resource = vdc.get_vapp(name)
        vapp = VApp(client, resource=vapp_resource)
        if len(vm_names) == 0:
            task = vapp.power_on()
            stdout(task, ctx)
        else:
            for vm_name in vm_names:
                vm = VM(client, resource=vapp.get_vm(vm_name))
                task = vm.power_on()
                stdout(task, ctx)
        stdout(task, ctx)
    except Exception as e:
        stderr(e, ctx)
예제 #13
0
def test_0090_install_retain_temp_vapp(config, unregister_cse_before_test):
    """Test install.

    Installation options: '--config', '--template', '--ssh-key',
        '--retain-temp-vapp'.

    Tests that installation:
    - downloads/uploads ova file,
    - creates photon temp vapp,
    - creates k8s templates
    - skips deleting the temp vapp
    - checks that proper packages are installed in the vm in temp vApp

    command: cse install --config cse_test_config.yaml --retain-temp-vapp
        --ssh-key ~/.ssh/id_rsa.pub
    required files: ~/.ssh/id_rsa.pub, cse_test_config.yaml
    expected: cse registered, catalog exists, source ovas exist,
        temp vapps exist, k8s templates exist.
    """
    cmd = f"install --config {env.ACTIVE_CONFIG_FILEPATH} --ssh-key " \
          f"{env.SSH_KEY_FILEPATH} --retain-temp-vapp"
    result = env.CLI_RUNNER.invoke(cli, cmd.split(), catch_exceptions=False)
    assert result.exit_code == 0,\
        testutils.format_command_info('cse', cmd, result.exit_code,
                                      result.output)

    # check that cse was registered correctly
    env.check_cse_registration(config['amqp']['routing_key'],
                               config['amqp']['exchange'])

    vdc = VDC(env.CLIENT, href=env.VDC_HREF)
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    for template_config in env.TEMPLATE_DEFINITIONS:
        # check that source ova file exists in catalog
        assert env.catalog_item_exists(
            template_config['source_ova_name']), \
            'Source ova file does not existswhen it should.'

        # check that k8s templates exist
        catalog_item_name = get_revisioned_template_name(
            template_config['name'], template_config['revision'])
        assert env.catalog_item_exists(catalog_item_name), \
            'k8s template does not exist when it should.'

        # check that temp vapp exists
        temp_vapp_name = testutils.get_temp_vapp_name(template_config['name'])
        try:
            vdc.reload()
            vapp_resource = vdc.get_vapp(temp_vapp_name)
        except EntityNotFoundException:
            assert False, 'vApp does not exist when it should.'

        # ssh into vms to check for installed software
        vapp = VApp(env.CLIENT, resource=vapp_resource)
        # The temp vapp is shutdown before the template is captured, it
        # needs to be powered on before trying to ssh into it.
        task = vapp.power_on()
        env.CLIENT.get_task_monitor().wait_for_success(task)

        # HACK! let the ssh daemon come up
        time.sleep(env.WAIT_INTERVAL)  # 30 seconds

        ip = vapp.get_primary_ip(TEMP_VAPP_VM_NAME)
        try:
            ssh_client.connect(ip, username='******')
            # run different commands depending on OS
            if 'photon' in temp_vapp_name:
                script_filepath = get_local_script_filepath(
                    template_config['name'], template_config['revision'],
                    ScriptFile.CUST)
                script = read_data_file(script_filepath)
                pattern = r'(kubernetes\S*)'
                packages = re.findall(pattern, script)
                stdin, stdout, stderr = ssh_client.exec_command("rpm -qa")
                installed = [line.strip('.x86_64\n') for line in stdout]
                for package in packages:
                    assert package in installed, \
                        f"{package} not found in Photon VM"
            elif 'ubuntu' in temp_vapp_name:
                script_filepath = get_local_script_filepath(
                    template_config['name'], template_config['revision'],
                    ScriptFile.CUST)
                script = read_data_file(script_filepath)
                pattern = r'((kubernetes|docker\S*|kubelet|kubeadm|kubectl)\S*=\S*)'  # noqa: E501
                packages = [tup[0] for tup in re.findall(pattern, script)]
                cmd = "dpkg -l | awk '{print $2\"=\"$3}'"
                stdin, stdout, stderr = ssh_client.exec_command(cmd)
                installed = [line.strip() for line in stdout]
                for package in packages:
                    assert package in installed, \
                        f"{package} not found in Ubuntu VM"
        finally:
            if ssh_client:
                ssh_client.close()
예제 #14
0
def create_template(ctx, config, client, org, vdc_resource, catalog,
                    no_capture, template):
    ctx.obj = {}
    ctx.obj['client'] = client
    try:
        source_ova_item = org.get_catalog_item(config['broker']['catalog'],
                                               template['source_ova_name'])
    except Exception:
        source_ova_item = upload_source_ova(config, client, org, template)
    click.secho('Find source ova \'%s\': %s' %
                (template['source_ova_name'],
                 bool_to_msg(source_ova_item is not None)))
    if source_ova_item is None:
        return None
    item_id = source_ova_item.get('id')
    flag = False
    while True:
        q = client.get_typed_query(
            'adminCatalogItem',
            query_result_format=QueryResultFormat.ID_RECORDS,
            qfilter='id==%s' % item_id)
        records = list(q.execute())
        if records[0].get('status') == 'RESOLVED':
            if flag:
                click.secho('done', fg='blue')
            break
        else:
            if flag:
                click.secho('.', nl=False, fg='green')
            else:
                click.secho('Waiting for upload to complete...',
                            nl=False,
                            fg='green')
                flag = True
            time.sleep(5)
    vdc = VDC(client, resource=vdc_resource)
    try:
        vapp_resource = vdc.get_vapp(template['temp_vapp'])
    except Exception:
        vapp_resource = None
    if vapp_resource is None:
        click.secho('Creating vApp template \'%s\'' % template['temp_vapp'],
                    fg='green')

        init_script = get_data_file('init-%s.sh' % template['name'])
        vapp_resource = vdc.instantiate_vapp(
            template['temp_vapp'],
            catalog.get('name'),
            template['source_ova_name'],
            network=config['broker']['network'],
            fence_mode='bridged',
            ip_allocation_mode=config['broker']['ip_allocation_mode'],
            deploy=True,
            power_on=True,
            memory=template['mem'],
            cpu=template['cpu'],
            password=None,
            cust_script=init_script,
            accept_all_eulas=True,
            vm_name=template['temp_vapp'],
            hostname=template['temp_vapp'],
            storage_profile=config['broker']['storage_profile'])
        stdout(vapp_resource.Tasks.Task[0], ctx)
        vapp = VApp(client, resource=vapp_resource)
        if template[
                'source_ova_name'] == 'ubuntu-16.04-server-cloudimg-amd64.ova':
            vapp.reload()
            vs = get_vsphere(config, vapp, template['temp_vapp'])
            vs.connect()
            moid = vapp.get_vm_moid(template['temp_vapp'])
            vm = vs.get_vm_by_moid(moid)
            vs.wait_until_tools_ready(vm,
                                      sleep=5,
                                      callback=wait_for_tools_ready_callback)
            click.secho('Rebooting vApp (Ubuntu)', fg='green')
            vapp.reload()
            task = vapp.shutdown()
            stdout(task, ctx)
            vapp.reload()
            task = vapp.power_on()
            stdout(task, ctx)
        click.secho('Customizing vApp template \'%s\'' % template['temp_vapp'],
                    fg='green')
        vapp.reload()
        password_auto = vapp.get_admin_password(template['temp_vapp'])
        cust_script = get_data_file('cust-%s.sh' % template['name'])
        for attempt in range(5):
            click.secho('Attempt #%s' % str(attempt + 1), fg='green')
            vs = get_vsphere(config, vapp, template['temp_vapp'])
            vs.connect()
            moid = vapp.get_vm_moid(template['temp_vapp'])
            vm = vs.get_vm_by_moid(moid)
            vs.wait_until_tools_ready(vm,
                                      sleep=5,
                                      callback=wait_for_tools_ready_callback)
            result = []
            try:
                result = vs.execute_script_in_guest(
                    vm,
                    'root',
                    password_auto,
                    cust_script,
                    target_file=None,
                    wait_for_completion=True,
                    wait_time=10,
                    get_output=True,
                    delete_script=True,
                    callback=wait_for_guest_execution_callback)
            except Exception as e:
                LOGGER.error(traceback.format_exc())
                click.secho(traceback.format_exc(), fg='red')
            if len(result) > 0:
                click.secho('Result: %s' % result)
                result_stdout = result[1].content.decode()
                result_stderr = result[2].content.decode()
                click.secho('stderr:')
                if len(result_stderr) > 0:
                    click.secho(result_stderr, err=True)
                click.secho('stdout:')
                if len(result_stdout) > 0:
                    click.secho(result_stdout, err=False)
                if result[0] == 0:
                    break
            if len(result) == 0 or result[0] != 0:
                click.secho('Customization attempt #%s failed' %
                            int(attempt + 1),
                            fg='red')
                if attempt < 4:
                    click.secho('Will try again')
                    time.sleep(5)
                else:
                    raise Exception('Failed to customize VM')

    if not no_capture:
        capture_as_template(ctx, config, vapp_resource, org, catalog, template)
        if template['cleanup']:
            click.secho('Deleting vApp template \'%s\' ' %
                        template['temp_vapp'],
                        fg='green')
            vdc.reload()
            task = vdc.delete_vapp(template['temp_vapp'], force=True)
            stdout(task, ctx)