Ejemplo n.º 1
0
 def test_correct_state(self):
     vm = VirtualMachineFactory()
     vm.operstate = 'foo'
     self.assertEqual(utils.get_rsapi_state(vm), "UNKNOWN")
     vm.operstate = "STARTED"
     vm.deleted = True
     self.assertEqual(utils.get_rsapi_state(vm), "DELETED")
     vm.deleted = False
     vm.backendopcode = "OP_INSTANCE_REBOOT"
     vm.backendjobstatus = "waiting"
     self.assertEqual(utils.get_rsapi_state(vm), "REBOOT")
Ejemplo n.º 2
0
 def test_correct_state(self):
     vm = VirtualMachineFactory()
     vm.operstate = 'foo'
     self.assertEqual(utils.get_rsapi_state(vm), "UNKNOWN")
     vm.operstate = "STARTED"
     vm.deleted = True
     self.assertEqual(utils.get_rsapi_state(vm), "DELETED")
     vm.deleted = False
     vm.backendopcode = "OP_INSTANCE_REBOOT"
     vm.backendjobstatus = "waiting"
     self.assertEqual(utils.get_rsapi_state(vm), "REBOOT")
Ejemplo n.º 3
0
    def test_server_detail(self):
        """Test if a server details are returned."""
        db_vm = self.vm2
        user = self.vm2.userid
        net = mfactory.NetworkFactory()
        nic = mfactory.NetworkInterfaceFactory(machine=self.vm2, network=net,
                                              ipv6="::babe")

        db_vm_meta = mfactory.VirtualMachineMetadataFactory(vm=db_vm)

        response = self.myget('servers/%d' % db_vm.id, user)
        server = json.loads(response.content)['server']

        self.assertEqual(server['flavor']["id"], db_vm.flavor.id)
        self.assertEqual(server['hostId'], db_vm.hostid)
        self.assertEqual(server['id'], db_vm.id)
        self.assertEqual(server['image']["id"], db_vm.imageid)
        self.assertEqual(server['name'], db_vm.name)
        self.assertEqual(server['status'], get_rsapi_state(db_vm))
        api_nic = server['attachments'][0]
        self.assertEqual(api_nic['network_id'], str(net.id))
        self.assertEqual(api_nic['mac_address'], nic.mac)
        self.assertEqual(api_nic['firewallProfile'], nic.firewall_profile)
        self.assertEqual(api_nic['ipv4'], nic.ipv4)
        self.assertEqual(api_nic['ipv6'], nic.ipv6)
        self.assertEqual(api_nic['id'], 'nic-%s-%s' % (db_vm.id, nic.index))
        api_address = server["addresses"]
        self.assertEqual(api_address[str(net.id)],
               [{"version": 4, "addr": nic.ipv4, "OS-EXT-IPS:type": "fixed"},
                {"version": 6, "addr": nic.ipv6, "OS-EXT-IPS:type": "fixed"}])

        metadata = server['metadata']
        self.assertEqual(len(metadata), 1)
        self.assertEqual(metadata[db_vm_meta.meta_key], db_vm_meta.meta_value)
        self.assertSuccess(response)
Ejemplo n.º 4
0
def vm_to_dict(vm, detail=False):
    d = dict(id=vm.id, name=vm.name)
    d['links'] = util.vm_to_links(vm.id)
    if detail:
        d['user_id'] = vm.userid
        d['tenant_id'] = vm.project
        d['shared_to_project'] = vm.shared_to_project
        d['status'] = logic_utils.get_rsapi_state(vm)
        d['SNF:task_state'] = logic_utils.get_task_state(vm)
        d['progress'] = 100 if d['status'] == 'ACTIVE' else vm.buildpercentage
        d['hostId'] = vm.hostid
        d['updated'] = utils.isoformat(vm.updated)
        d['created'] = utils.isoformat(vm.created)
        d['flavor'] = {
            "id": vm.flavor_id,
            "links": util.flavor_to_links(vm.flavor_id)
        }
        d['image'] = {
            "id": vm.imageid,
            "links": util.image_to_links(vm.imageid)
        }
        d['suspended'] = vm.suspended

        metadata = dict((m.meta_key, m.meta_value) for m in vm.metadata.all())
        d['metadata'] = metadata

        nics = vm.nics.all()
        active_nics = filter(lambda nic: nic.state == "ACTIVE", nics)
        active_nics.sort(key=lambda nic: nic.id)
        attachments = map(nic_to_attachments, active_nics)
        d['attachments'] = attachments
        d['addresses'] = attachments_to_addresses(attachments)

        d['volumes'] = [
            v.id for v in vm.volumes.filter(deleted=False).order_by('id')
        ]

        # include the latest vm diagnostic, if set
        diagnostic = vm.get_last_diagnostic()
        if diagnostic:
            d['diagnostics'] = diagnostics_to_dict([diagnostic])
        else:
            d['diagnostics'] = []
        # Fixed
        d["security_groups"] = [{"name": "default"}]
        key_names = json.loads(vm.key_names)
        d["key_name"] = key_names[0] if len(key_names) > 0 else None
        d["SNF:key_names"] = key_names
        d["config_drive"] = ""
        d["accessIPv4"] = ""
        d["accessIPv6"] = ""
        fqdn = get_server_fqdn(vm, active_nics)
        d["SNF:fqdn"] = fqdn
        d["SNF:port_forwarding"] = get_server_port_forwarding(
            vm, active_nics, fqdn)
        d['deleted'] = vm.deleted
        d['SNF:rescue'] = vm.rescue
    return d
Ejemplo n.º 5
0
def vm_to_dict(vm, detail=False):
    d = dict(id=vm.id, name=vm.name)
    d['links'] = util.vm_to_links(vm.id)
    if detail:
        d['user_id'] = vm.userid
        d['tenant_id'] = vm.userid
        d['status'] = get_rsapi_state(vm)
        d['progress'] = 100 if get_rsapi_state(vm) == 'ACTIVE' \
            else vm.buildpercentage
        d['hostId'] = vm.hostid
        d['updated'] = utils.isoformat(vm.updated)
        d['created'] = utils.isoformat(vm.created)
        d['flavor'] = {
            "id": vm.flavor.id,
            "links": util.flavor_to_links(vm.flavor.id)
        }
        d['image'] = {
            "id": vm.imageid,
            "links": util.image_to_links(vm.imageid)
        }
        d['suspended'] = vm.suspended

        metadata = dict((m.meta_key, m.meta_value) for m in vm.metadata.all())
        d['metadata'] = metadata

        vm_nics = vm.nics.filter(state="ACTIVE").order_by("index")
        attachments = map(nic_to_dict, vm_nics)
        d['attachments'] = attachments
        d['addresses'] = nics_to_addresses(vm_nics)

        # include the latest vm diagnostic, if set
        diagnostic = vm.get_last_diagnostic()
        if diagnostic:
            d['diagnostics'] = diagnostics_to_dict([diagnostic])
        else:
            d['diagnostics'] = []
        # Fixed
        d["security_groups"] = [{"name": "default"}]
        d["key_name"] = None
        d["config_drive"] = ""
        d["accessIPv4"] = ""
        d["accessIPv6"] = ""

    return d
Ejemplo n.º 6
0
def vm_to_dict(vm, detail=False):
    d = dict(id=vm.id, name=vm.name)
    d['links'] = util.vm_to_links(vm.id)
    if detail:
        d['user_id'] = vm.userid
        d['tenant_id'] = vm.project
        d['shared_to_project'] = vm.shared_to_project
        d['status'] = logic_utils.get_rsapi_state(vm)
        d['SNF:task_state'] = logic_utils.get_task_state(vm)
        d['progress'] = 100 if d['status'] == 'ACTIVE' else vm.buildpercentage
        d['hostId'] = vm.hostid
        d['updated'] = utils.isoformat(vm.updated)
        d['created'] = utils.isoformat(vm.created)
        d['flavor'] = {"id": vm.flavor_id,
                       "links": util.flavor_to_links(vm.flavor_id)}
        d['image'] = {"id": vm.imageid,
                      "links": util.image_to_links(vm.imageid)}
        d['suspended'] = vm.suspended

        metadata = dict((m.meta_key, m.meta_value) for m in vm.metadata.all())
        d['metadata'] = metadata

        nics = vm.nics.all()
        active_nics = filter(lambda nic: nic.state == "ACTIVE", nics)
        active_nics.sort(key=lambda nic: nic.id)
        attachments = map(nic_to_attachments, active_nics)
        d['attachments'] = attachments
        d['addresses'] = attachments_to_addresses(attachments)

        d['volumes'] = [v.id for v in vm.volumes.filter(deleted=False)
                                                .order_by('id')]

        # include the latest vm diagnostic, if set
        diagnostic = vm.get_last_diagnostic()
        if diagnostic:
            d['diagnostics'] = diagnostics_to_dict([diagnostic])
        else:
            d['diagnostics'] = []
        # Fixed
        d["security_groups"] = [{"name": "default"}]
        key_names = json.loads(vm.key_names)
        d["key_name"] = key_names[0] if len(key_names) > 0 else None
        d["SNF:key_names"] = key_names
        d["config_drive"] = ""
        d["accessIPv4"] = ""
        d["accessIPv6"] = ""
        fqdn = get_server_fqdn(vm, active_nics)
        d["SNF:fqdn"] = fqdn
        d["SNF:port_forwarding"] = get_server_port_forwarding(vm, active_nics,
                                                              fqdn)
        d['deleted'] = vm.deleted
        d['SNF:rescue'] = vm.rescue
    return d
Ejemplo n.º 7
0
def vm_to_dict(vm, detail=False):
    d = dict(id=vm.id, name=vm.name)
    d['links'] = util.vm_to_links(vm.id)
    if detail:
        d['user_id'] = vm.userid
        d['tenant_id'] = vm.userid
        d['status'] = get_rsapi_state(vm)
        d['progress'] = 100 if get_rsapi_state(vm) == 'ACTIVE' \
            else vm.buildpercentage
        d['hostId'] = vm.hostid
        d['updated'] = utils.isoformat(vm.updated)
        d['created'] = utils.isoformat(vm.created)
        d['flavor'] = {"id": vm.flavor.id,
                       "links": util.flavor_to_links(vm.flavor.id)}
        d['image'] = {"id": vm.imageid,
                      "links": util.image_to_links(vm.imageid)}
        d['suspended'] = vm.suspended

        metadata = dict((m.meta_key, m.meta_value) for m in vm.metadata.all())
        d['metadata'] = metadata

        vm_nics = vm.nics.filter(state="ACTIVE").order_by("index")
        attachments = map(nic_to_dict, vm_nics)
        d['attachments'] = attachments
        d['addresses'] = nics_to_addresses(vm_nics)

        # include the latest vm diagnostic, if set
        diagnostic = vm.get_last_diagnostic()
        if diagnostic:
            d['diagnostics'] = diagnostics_to_dict([diagnostic])
        else:
            d['diagnostics'] = []
        # Fixed
        d["security_groups"] = [{"name": "default"}]
        d["key_name"] = None
        d["config_drive"] = ""
        d["accessIPv4"] = ""
        d["accessIPv6"] = ""

    return d
Ejemplo n.º 8
0
    def test_server_list_detail(self):
        """Test if the servers list details are returned."""
        user = self.user2
        user_vms = {self.vm2.id: self.vm2, self.vm4.id: self.vm4}

        response = self.myget('servers/detail', user)
        servers = json.loads(response.content)['servers']
        self.assertEqual(len(servers), len(user_vms))
        for api_vm in servers:
            db_vm = user_vms[api_vm['id']]
            self.assertEqual(api_vm['flavor']["id"], db_vm.flavor.id)
            self.assertEqual(api_vm['hostId'], db_vm.hostid)
            self.assertEqual(api_vm['id'], db_vm.id)
            self.assertEqual(api_vm['image']["id"], db_vm.imageid)
            self.assertEqual(api_vm['name'], db_vm.name)
            self.assertEqual(api_vm['status'], get_rsapi_state(db_vm))
            self.assertSuccess(response)
Ejemplo n.º 9
0
    def test_server_list_detail(self):
        """Test if the servers list details are returned."""
        user = self.user2
        user_vms = {self.vm2.id: self.vm2, self.vm4.id: self.vm4}

        response = self.myget("servers/detail", user)
        servers = json.loads(response.content)["servers"]
        self.assertEqual(len(servers), len(user_vms))
        for api_vm in servers:
            db_vm = user_vms[api_vm["id"]]
            self.assertEqual(api_vm["flavor"]["id"], db_vm.flavor.id)
            self.assertEqual(api_vm["hostId"], db_vm.hostid)
            self.assertEqual(api_vm["id"], db_vm.id)
            self.assertEqual(api_vm["image"]["id"], db_vm.imageid)
            self.assertEqual(api_vm["name"], db_vm.name)
            self.assertEqual(api_vm["status"], get_rsapi_state(db_vm))
            self.assertSuccess(response)
Ejemplo n.º 10
0
    def test_server_detail(self):
        """Test if a server details are returned."""
        db_vm = self.vm2
        user = self.vm2.userid
        ip4 = mfactory.IPv4AddressFactory(nic__machine=self.vm2)
        nic = ip4.nic
        net = ip4.network
        ip6 = mfactory.IPv6AddressFactory(nic=nic, network=net)
        nic.mac = "aa:00:11:22:33:44"
        nic.save()

        db_vm_meta = mfactory.VirtualMachineMetadataFactory(vm=db_vm)

        response = self.myget('servers/%d' % db_vm.id, user)
        server = json.loads(response.content)['server']

        self.assertEqual(server['flavor']["id"], db_vm.flavor.id)
        self.assertEqual(server['hostId'], db_vm.hostid)
        self.assertEqual(server['id'], db_vm.id)
        self.assertEqual(server['image']["id"], db_vm.imageid)
        self.assertEqual(server['name'], db_vm.name)
        self.assertEqual(server['status'], get_rsapi_state(db_vm))
        api_nic = server['attachments'][0]
        self.assertEqual(api_nic['network_id'], str(net.id))
        self.assertEqual(api_nic['mac_address'], nic.mac)
        self.assertEqual(api_nic['firewallProfile'], nic.firewall_profile)
        self.assertEqual(api_nic['ipv4'], ip4.address)
        self.assertEqual(api_nic['ipv6'], ip6.address)
        self.assertEqual(api_nic['OS-EXT-IPS:type'], "fixed")
        self.assertEqual(api_nic['id'], nic.id)
        api_address = server["addresses"]
        self.assertEqual(api_address[str(net.id)], [{
            "version": 4,
            "addr": ip4.address,
            "OS-EXT-IPS:type": "fixed"
        }, {
            "version": 6,
            "addr": ip6.address,
            "OS-EXT-IPS:type": "fixed"
        }])

        metadata = server['metadata']
        self.assertEqual(len(metadata), 1)
        self.assertEqual(metadata[db_vm_meta.meta_key], db_vm_meta.meta_value)
        self.assertSuccess(response)
Ejemplo n.º 11
0
    def test_server_detail(self):
        """Test if a server details are returned."""
        db_vm = self.vm2
        user = self.vm2.userid
        ip4 = mfactory.IPv4AddressFactory(nic__machine=self.vm2)
        nic = ip4.nic
        net = ip4.network
        ip6 = mfactory.IPv6AddressFactory(nic=nic, network=net)
        nic.mac = "aa:00:11:22:33:44"
        nic.save()

        db_vm_meta = mfactory.VirtualMachineMetadataFactory(vm=db_vm)

        response = self.myget("servers/%d" % db_vm.id, user)
        server = json.loads(response.content)["server"]

        self.assertEqual(server["flavor"]["id"], db_vm.flavor.id)
        self.assertEqual(server["hostId"], db_vm.hostid)
        self.assertEqual(server["id"], db_vm.id)
        self.assertEqual(server["image"]["id"], db_vm.imageid)
        self.assertEqual(server["name"], db_vm.name)
        self.assertEqual(server["status"], get_rsapi_state(db_vm))
        api_nic = server["attachments"][0]
        self.assertEqual(api_nic["network_id"], str(net.id))
        self.assertEqual(api_nic["mac_address"], nic.mac)
        self.assertEqual(api_nic["firewallProfile"], nic.firewall_profile)
        self.assertEqual(api_nic["ipv4"], ip4.address)
        self.assertEqual(api_nic["ipv6"], ip6.address)
        self.assertEqual(api_nic["OS-EXT-IPS:type"], "fixed")
        self.assertEqual(api_nic["id"], nic.id)
        api_address = server["addresses"]
        self.assertEqual(
            api_address[str(net.id)],
            [
                {"version": 4, "addr": ip4.address, "OS-EXT-IPS:type": "fixed"},
                {"version": 6, "addr": ip6.address, "OS-EXT-IPS:type": "fixed"},
            ],
        )

        metadata = server["metadata"]
        self.assertEqual(len(metadata), 1)
        self.assertEqual(metadata[db_vm_meta.meta_key], db_vm_meta.meta_value)
        self.assertSuccess(response)
Ejemplo n.º 12
0
    def test_server_detail(self):
        """Test if a server details are returned."""
        db_vm = self.vm2
        user = self.vm2.userid
        net = mfactory.NetworkFactory()
        nic = mfactory.NetworkInterfaceFactory(machine=self.vm2,
                                               network=net,
                                               ipv6="::babe")

        db_vm_meta = mfactory.VirtualMachineMetadataFactory(vm=db_vm)

        response = self.myget('servers/%d' % db_vm.id, user)
        server = json.loads(response.content)['server']

        self.assertEqual(server['flavor']["id"], db_vm.flavor.id)
        self.assertEqual(server['hostId'], db_vm.hostid)
        self.assertEqual(server['id'], db_vm.id)
        self.assertEqual(server['image']["id"], db_vm.imageid)
        self.assertEqual(server['name'], db_vm.name)
        self.assertEqual(server['status'], get_rsapi_state(db_vm))
        api_nic = server['attachments'][0]
        self.assertEqual(api_nic['network_id'], str(net.id))
        self.assertEqual(api_nic['mac_address'], nic.mac)
        self.assertEqual(api_nic['firewallProfile'], nic.firewall_profile)
        self.assertEqual(api_nic['ipv4'], nic.ipv4)
        self.assertEqual(api_nic['ipv6'], nic.ipv6)
        self.assertEqual(api_nic['id'], 'nic-%s-%s' % (db_vm.id, nic.index))
        api_address = server["addresses"]
        self.assertEqual(api_address[str(net.id)], [{
            "version": 4,
            "addr": nic.ipv4,
            "OS-EXT-IPS:type": "fixed"
        }, {
            "version": 6,
            "addr": nic.ipv6,
            "OS-EXT-IPS:type": "fixed"
        }])

        metadata = server['metadata']
        self.assertEqual(len(metadata), 1)
        self.assertEqual(metadata[db_vm_meta.meta_key], db_vm_meta.meta_value)
        self.assertSuccess(response)
Ejemplo n.º 13
0
def get_console(request, vm, args):
    """Arrange for an OOB console of the specified type

    This method arranges for an OOB console of the specified type.
    Only consoles of type "vnc" are supported for now.

    It uses a running instance of vncauthproxy to setup proper
    VNC forwarding with a random password, then returns the necessary
    VNC connection info to the caller.

    """
    # Normal Response Code: 200
    # Error Response Codes: computeFault (400, 500),
    #                       serviceUnavailable (503),
    #                       unauthorized (401),
    #                       badRequest (400),
    #                       badMediaType(415),
    #                       itemNotFound (404),
    #                       buildInProgress (409),
    #                       overLimit (413)

    log.info("Get console  VM %s", vm)
    console_type = args.get('type', '')
    if (console_type != 'vnc' and console_type != 'wsvnc'):
        raise faults.BadRequest('Type can only be "vnc" or "wsvnc."')

    # Use RAPI to get VNC console information for this instance
    if get_rsapi_state(vm) != 'ACTIVE':
        raise faults.BadRequest('Server not in ACTIVE state.')

    if settings.TEST:
        console_data = {'kind': 'vnc', 'host': 'ganeti_node', 'port': 1000}
    else:
        console_data = backend.get_instance_console(vm)

    if console_data['kind'] != 'vnc':
        message = 'got console of kind %s, not "vnc"' % console_data['kind']
        raise faults.ServiceUnavailable(message)

    # Let vncauthproxy decide on the source port.
    # The alternative: static allocation, e.g.
    # sport = console_data['port'] - 1000
    sport = 27631
    daddr = console_data['host']
    dport = console_data['port']
    password = random_password()

    if settings.TEST:
        fwd = {'source_port': 1234, 'status': 'OK'}
    else:
        fwd = request_vnc_forwarding(sport, daddr, dport, password,auth_user="******",auth_password="******",console_type=console_type)
        #fwd = request_vnc_forwarding(sport, daddr, dport, password)
    if fwd['status'] != "OK":
        raise faults.ServiceUnavailable('vncauthproxy returned error status')

    # Verify that the VNC server settings haven't changed
    if not settings.TEST:
        if console_data != backend.get_instance_console(vm):
            raise faults.ServiceUnavailable('VNC Server settings changed.')

    console = {
        'type': console_type,
        'host': getfqdn(),
        'port': fwd['source_port'],
        'password': password}

    if request.serialization == 'xml':
        mimetype = 'application/xml'
        data = render_to_string('console.xml', {'console': console})
    else:
        mimetype = 'application/json'
        data = json.dumps({'console': console})

    return HttpResponse(data, mimetype=mimetype, status=200)
Ejemplo n.º 14
0
def get_console(request, vm, args):
    """Arrange for an OOB console of the specified type

    This method arranges for an OOB console of the specified type.
    Only consoles of type "vnc" are supported for now.

    It uses a running instance of vncauthproxy to setup proper
    VNC forwarding with a random password, then returns the necessary
    VNC connection info to the caller.

    """
    # Normal Response Code: 200
    # Error Response Codes: computeFault (400, 500),
    #                       serviceUnavailable (503),
    #                       unauthorized (401),
    #                       badRequest (400),
    #                       badMediaType(415),
    #                       itemNotFound (404),
    #                       buildInProgress (409),
    #                       overLimit (413)

    log.info("Get console  VM %s", vm)
    console_type = args.get('type', '')
    if (console_type != 'vnc' and console_type != 'wsvnc'):
        raise faults.BadRequest('Type can only be "vnc" or "wsvnc."')

    # Use RAPI to get VNC console information for this instance
    if get_rsapi_state(vm) != 'ACTIVE':
        raise faults.BadRequest('Server not in ACTIVE state.')

    if settings.TEST:
        console_data = {'kind': 'vnc', 'host': 'ganeti_node', 'port': 1000}
    else:
        console_data = backend.get_instance_console(vm)

    if console_data['kind'] != 'vnc':
        message = 'got console of kind %s, not "vnc"' % console_data['kind']
        raise faults.ServiceUnavailable(message)

    # Let vncauthproxy decide on the source port.
    # The alternative: static allocation, e.g.
    # sport = console_data['port'] - 1000
    sport = 27631
    daddr = console_data['host']
    dport = console_data['port']
    password = random_password()

    if settings.TEST:
        fwd = {'source_port': 1234, 'status': 'OK'}
    else:
        fwd = request_vnc_forwarding(sport,
                                     daddr,
                                     dport,
                                     password,
                                     auth_user="******",
                                     auth_password="******",
                                     console_type=console_type)
        #fwd = request_vnc_forwarding(sport, daddr, dport, password)
    if fwd['status'] != "OK":
        raise faults.ServiceUnavailable('vncauthproxy returned error status')

    # Verify that the VNC server settings haven't changed
    if not settings.TEST:
        if console_data != backend.get_instance_console(vm):
            raise faults.ServiceUnavailable('VNC Server settings changed.')

    console = {
        'type': console_type,
        'host': getfqdn(),
        'port': fwd['source_port'],
        'password': password
    }

    if request.serialization == 'xml':
        mimetype = 'application/xml'
        data = render_to_string('console.xml', {'console': console})
    else:
        mimetype = 'application/json'
        data = json.dumps({'console': console})

    return HttpResponse(data, mimetype=mimetype, status=200)