Exemplo n.º 1
0
    def _show(self,
              resource_type,
              response_file,
              uuid1,
              uuid2=None,
              relations=None):
        target_uuid = uuid2 or uuid1
        if resource_type.endswith('attachment'):
            resource_type = resource_type[:resource_type.index('attachment')]
        with open("%s/%s" % (self.fake_files_path, response_file)) as f:
            response_template = f.read()
            res_dict = getattr(self, '_fake_%s_dict' % resource_type)
            for item in res_dict.itervalues():
                if 'tags' in item:
                    item['tags_json'] = jsonutils.dumps(item['tags'])

                # replace sec prof rules with their json dump
                def jsonify_rules(rule_key):
                    if rule_key in item:
                        rules_json = jsonutils.dumps(item[rule_key])
                        item['%s_json' % rule_key] = rules_json

                jsonify_rules('logical_port_egress_rules')
                jsonify_rules('logical_port_ingress_rules')

            items = [
                jsonutils.loads(response_template % res_dict[res_uuid])
                for res_uuid in res_dict if res_uuid == target_uuid
            ]
            if items:
                return jsonutils.dumps(items[0])
            raise api_exc.ResourceNotFound()
Exemplo n.º 2
0
 def _lrouter_match(res_uuid):
     # verify that the router exist
     if parent_uuid and parent_uuid not in self._fake_lrouter_dict:
         raise api_exc.ResourceNotFound()
     if (not parent_uuid
             or res_dict[res_uuid].get('lr_uuid') == parent_uuid):
         return True
     return False
Exemplo n.º 3
0
 def handle_delete(self, url):
     parsedurl = urlparse.urlparse(url)
     (res_type, uuids) = self._get_resource_type(parsedurl.path)
     response_file = self.FAKE_PUT_RESPONSES.get(res_type)
     if not response_file:
         raise Exception("resource not found")
     res_dict = getattr(self, '_fake_%s_dict' % res_type)
     try:
         del res_dict[uuids[-1]]
     except KeyError:
         raise api_exc.ResourceNotFound()
     return ""
Exemplo n.º 4
0
 def _add_lrouter_lport(self, body, lr_uuid):
     new_uuid = uuidutils.generate_uuid()
     fake_lport = self._build_lrouter_lport(body, new_uuid, lr_uuid)
     self._fake_lrouter_lport_dict[fake_lport['uuid']] = fake_lport
     try:
         fake_lrouter = self._fake_lrouter_dict[lr_uuid]
     except KeyError:
         raise api_exc.ResourceNotFound()
     fake_lrouter['lport_count'] += 1
     fake_lport_status = fake_lport.copy()
     fake_lport_status['lr_tenant_id'] = fake_lrouter['tenant_id']
     fake_lport_status['lr_uuid'] = fake_lrouter['uuid']
     fake_lport_status['lr_name'] = fake_lrouter['display_name']
     self._fake_lrouter_lportstatus_dict[new_uuid] = fake_lport_status
     return fake_lport
Exemplo n.º 5
0
    def handle_put(self, url, body):
        parsedurl = urlparse.urlparse(url)
        (res_type, uuids) = self._get_resource_type(parsedurl.path)
        response_file = self.FAKE_PUT_RESPONSES.get(res_type)
        if not response_file:
            raise Exception("resource not found")
        with open("%s/%s" % (self.fake_files_path, response_file)) as f:
            response_template = f.read()
            # Manage attachment operations
            is_attachment = False
            if res_type.endswith('attachment'):
                is_attachment = True
                res_type = res_type[:res_type.index('attachment')]
            res_dict = getattr(self, '_fake_%s_dict' % res_type)
            body_json = jsonutils.loads(body)
            val_func = self._validators.get(res_type)
            if val_func:
                val_func(body_json)
            try:
                resource = res_dict[uuids[-1]]
            except KeyError:
                raise api_exc.ResourceNotFound()
            if not is_attachment:
                edit_resource = getattr(self, '_build_%s' % res_type, None)
                if edit_resource:
                    body_json = edit_resource(body)
                resource.update(body_json)
            else:
                relations = resource.get("_relations", {})
                body_2 = jsonutils.loads(body)
                resource['att_type'] = body_2['type']
                relations['LogicalPortAttachment'] = body_2
                resource['_relations'] = relations
                if body_2['type'] == "PatchAttachment":
                    # We need to do a trick here
                    if self.LROUTER_RESOURCE in res_type:
                        res_type_2 = res_type.replace(self.LROUTER_RESOURCE,
                                                      self.LSWITCH_RESOURCE)
                    elif self.LSWITCH_RESOURCE in res_type:
                        res_type_2 = res_type.replace(self.LSWITCH_RESOURCE,
                                                      self.LROUTER_RESOURCE)
                    res_dict_2 = getattr(self, '_fake_%s_dict' % res_type_2)
                    body_2['peer_port_uuid'] = uuids[-1]
                    resource_2 = \
                        res_dict_2[jsonutils.loads(body)['peer_port_uuid']]
                    relations_2 = resource_2.get("_relations")
                    if not relations_2:
                        relations_2 = {}
                    relations_2['LogicalPortAttachment'] = body_2
                    resource_2['_relations'] = relations_2
                    resource['peer_port_uuid'] = body_2['peer_port_uuid']
                    resource['att_info_json'] = (
                        "\"peer_port_uuid\": \"%s\"," % resource_2['uuid'])
                    resource_2['att_info_json'] = (
                        "\"peer_port_uuid\": \"%s\"," %
                        body_2['peer_port_uuid'])
                elif body_2['type'] == "L3GatewayAttachment":
                    resource['attachment_gwsvc_uuid'] = (
                        body_2['l3_gateway_service_uuid'])
                    resource['vlan_id'] = body_2.get('vlan_id')
                elif body_2['type'] == "L2GatewayAttachment":
                    resource['attachment_gwsvc_uuid'] = (
                        body_2['l2_gateway_service_uuid'])
                elif body_2['type'] == "VifAttachment":
                    resource['vif_uuid'] = body_2['vif_uuid']
                    resource['att_info_json'] = ("\"vif_uuid\": \"%s\"," %
                                                 body_2['vif_uuid'])

            if not is_attachment:
                response = response_template % resource
            else:
                if res_type == self.LROUTER_LPORT_RESOURCE:
                    lr_uuid = uuids[0]
                    ls_uuid = None
                elif res_type == self.LSWITCH_LPORT_RESOURCE:
                    ls_uuid = uuids[0]
                    lr_uuid = None
                lp_uuid = uuids[1]
                response = response_template % self._fill_attachment(
                    jsonutils.loads(body), ls_uuid, lr_uuid, lp_uuid)
            return response
Exemplo n.º 6
0
    def _list(self,
              resource_type,
              response_file,
              parent_uuid=None,
              query=None,
              relations=None):
        (tag_filter, attr_filter, page_len,
         page_cursor) = self._get_filters(query)
        # result_count attribute in response should appear only when
        # page_cursor is not specified
        do_result_count = not page_cursor
        with open("%s/%s" % (self.fake_files_path, response_file)) as f:
            response_template = f.read()
            res_dict = getattr(self, '_fake_%s_dict' % resource_type)
            if parent_uuid == '*':
                parent_uuid = None
            # NSX raises ResourceNotFound if lswitch doesn't exist and is not *
            elif not res_dict and resource_type == self.LSWITCH_LPORT_RESOURCE:
                raise api_exc.ResourceNotFound()

            def _attr_match(res_uuid):
                if not attr_filter:
                    return True
                item = res_dict[res_uuid]
                for (attr, value) in attr_filter.iteritems():
                    if item.get(attr) != value:
                        return False
                return True

            def _tag_match(res_uuid):
                if not tag_filter:
                    return True
                return any([
                    x['scope'] == tag_filter['scope']
                    and x['tag'] == tag_filter['tag']
                    for x in res_dict[res_uuid]['tags']
                ])

            def _lswitch_match(res_uuid):
                # verify that the switch exist
                if parent_uuid and parent_uuid not in self._fake_lswitch_dict:
                    raise Exception(_("lswitch:%s not found") % parent_uuid)
                if (not parent_uuid
                        or res_dict[res_uuid].get('ls_uuid') == parent_uuid):
                    return True
                return False

            def _lrouter_match(res_uuid):
                # verify that the router exist
                if parent_uuid and parent_uuid not in self._fake_lrouter_dict:
                    raise api_exc.ResourceNotFound()
                if (not parent_uuid
                        or res_dict[res_uuid].get('lr_uuid') == parent_uuid):
                    return True
                return False

            def _cursor_match(res_uuid, page_cursor):
                if not page_cursor:
                    return True
                if page_cursor == res_uuid:
                    # always return True once page_cursor has been found
                    page_cursor = None
                    return True
                return False

            def _build_item(resource):
                item = jsonutils.loads(response_template % resource)
                if relations:
                    for relation in relations:
                        self._build_relation(resource, item, resource_type,
                                             relation)
                return item

            for item in res_dict.itervalues():
                if 'tags' in item:
                    item['tags_json'] = jsonutils.dumps(item['tags'])
            if resource_type in (self.LSWITCH_LPORT_RESOURCE,
                                 self.LSWITCH_LPORT_ATT,
                                 self.LSWITCH_LPORT_STATUS):
                parent_func = _lswitch_match
            elif resource_type in (self.LROUTER_LPORT_RESOURCE,
                                   self.LROUTER_LPORT_ATT,
                                   self.LROUTER_NAT_RESOURCE,
                                   self.LROUTER_LPORT_STATUS):
                parent_func = _lrouter_match
            else:
                parent_func = lambda x: True

            items = [
                _build_item(res_dict[res_uuid]) for res_uuid in res_dict
                if (parent_func(res_uuid) and _tag_match(res_uuid)
                    and _attr_match(res_uuid)
                    and _cursor_match(res_uuid, page_cursor))
            ]
            # Rather inefficient, but hey this is just a mock!
            next_cursor = None
            total_items = len(items)
            if page_len:
                try:
                    next_cursor = items[page_len]['uuid']
                except IndexError:
                    next_cursor = None
                items = items[:page_len]
            response_dict = {'results': items}
            if next_cursor:
                response_dict['page_cursor'] = next_cursor
            if do_result_count:
                response_dict['result_count'] = total_items
            return jsonutils.dumps(response_dict)