Exemplo n.º 1
0
 def has_permission(self, request, view):
     logger.debug("HasValidToken--has_permission::META> %s" % request.META)
     token = request.META.get('HTTP_X_AUTH_TOKEN', None)
     if token:
         state, metadata = VimDriverUtils.get_token_cache(token)
         if state:
             return True
     return False
Exemplo n.º 2
0
    def head(self, request, vimid="", servicetype="", requri=""):
        self._logger.info("vimid, servicetype, requri> %s,%s,%s"
                     % (vimid, servicetype, requri))
        self._logger.debug("META, data> %s , %s" % (request.META, request.data))

        token = self._get_token(request)
        try:
            vim = VimDriverUtils.get_vim_info(vimid)
            auth_state, metadata_catalog = VimDriverUtils.get_token_cache(token)
            sess = VimDriverUtils.get_session(vim, auth_state=auth_state)

            req_resource = ''
            if requri and requri != '':
                req_resource = "/" if re.match(r'//', requri) else ''+ requri

            cloud_owner, regionid = extsys.decode_vim_id(vimid)
            interface = 'public'
            service = {'service_type': servicetype,
                       'interface': interface,
                       'region_name': vim['openstack_region_id']
                           if vim.get('openstack_region_id')
                           else vim['cloud_region_id']
                       }


            self._logger.info("service head request with uri %s, %s" % (req_resource, service))
            resp = sess.head(req_resource, endpoint_filter=service)
            self._logger.info("service head response status %s" % (resp.status_code))

            content = resp.json() if resp.content else None
            self._logger.debug("service head response: %s" % (content))

            return Response(headers={'X-Subject-Token': token}, data=content, status=resp.status_code)
        except VimDriverNewtonException as e:
            self._logger.error("Plugin exception> status:%s,error:%s"
                                  % (e.status_code, e.content))
            return Response(data={'error': e.content}, status=e.status_code)
        except HttpError as e:
            self._logger.error("HttpError: status:%s, response:%s" % (e.http_status, e.response.json()))
            return Response(data=e.response.json(), status=e.http_status)
        except Exception as e:
            self._logger.error(traceback.format_exc())
            return Response(data={'error': str(e)},
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
Exemplo n.º 3
0
    def _do_action(self, action, request, vim_id, servicetype, requri):
        tmp_auth_token = self._get_token(request)
        try:
            # fetch the auth_state out of cache
            auth_state_str, metadata_catalog_str = VimDriverUtils.get_token_cache(tmp_auth_token)

            if not auth_state_str:
                #invalid token
                msg = {
                    'error': "request token %s is not valid" % (tmp_auth_token)
                }
                self._logger.warn("RESP with status, msg> %s , %s"
                                  % (status.HTTP_404_NOT_FOUND, msg))

                return Response(data=msg,
                                status=status.HTTP_404_NOT_FOUND)

            # get project name from auth_state
            auth_state = json.loads(auth_state_str)
            if not auth_state:
                # invalid token
                msg = {
                    'error': "request token %s is broken" % (tmp_auth_token)
                }
                self._logger.warn("RESP with status, msg> %s , %s"
                                  % (status.HTTP_404_NOT_FOUND, msg))
                return Response(data=msg,
                                status=status.HTTP_404_NOT_FOUND)

            tenant_name = auth_state['body']['token']['project']['name']
            #tenant_id = auth_state['body']['token']['project']['id']

            #find out the delegated DNSaaS provider
            viminfo = VimDriverUtils.get_vim_info(vim_id)
            if not viminfo:
                msg = {
                    'error': "vimid %s is not found" % (vim_id)
                }
                self._logger.warn("RESP with status, msg> %s , %s"
                                  % (status.HTTP_404_NOT_FOUND, msg))
                return Response(data=msg,
                                status=status.HTTP_404_NOT_FOUND)

            cloud_dns_delegate_info = None
            cloud_extra_info_str = viminfo.get('cloud_extra_info')
            if cloud_extra_info_str:
                cloud_extra_info = json.loads(cloud_extra_info_str)
                cloud_dns_delegate_info = cloud_extra_info.get("dns-delegate")

            if not cloud_dns_delegate_info \
                    or not cloud_dns_delegate_info.get("cloud-owner") \
                    or not cloud_dns_delegate_info.get("cloud-region-id"):
                msg = {
                    'error': "dns-delegate for vimid %s is not configured"
                             % (vim_id)
                }
                self._logger.warn("RESP with status, msg> %s , %s"
                                  % (status.HTTP_404_NOT_FOUND, msg))

                return Response(data=msg,
                                status=status.HTTP_404_NOT_FOUND)

            vimid_delegate = cloud_dns_delegate_info.get("cloud-owner") \
                             + "_" \
                             + cloud_dns_delegate_info.get("cloud-region-id")


            #now forward request to delegated DNS service endpoint
            vim = VimDriverUtils.get_vim_info(vimid_delegate)
            if not vim:
                msg = {
                    'error': "delegated vimid %s is not found" % (vimid_delegate)
                }
                self._logger.warn("RESP with status, msg> %s , %s"
                                  % (status.HTTP_404_NOT_FOUND, msg))
                return Response(data=msg,
                                status=status.HTTP_404_NOT_FOUND)

            sess = VimDriverUtils.get_session(vim, tenant_name=tenant_name)

            cloud_owner, regionid = extsys.decode_vim_id(vimid_delegate)
            interface = 'public'
            service = {
                'service_type': servicetype,
                'interface': interface,
                'region_name': vim['openstack_region_id']
                           if vim.get('openstack_region_id')
                           else vim['cloud_region_id']
            }


            req_resource = requri
            querystr = VimDriverUtils.get_query_part(request)
            if querystr:
                req_resource += "?" + querystr

            self._logger.info("service " + action + " request with uri %s" % (req_resource))
            if(action == "get"):
                resp = sess.get(req_resource, endpoint_filter=service,
                                headers={"Content-Type": "application/json",
                                         "Accept": "application/json"})
            elif(action == "post"):
                resp = sess.post(req_resource, data=json.JSONEncoder().encode(request.data),
                                 endpoint_filter=service,
                                 headers={"Content-Type": "application/json",
                                          "Accept": "application/json"})
            elif(action == "put"):
                resp = sess.put(req_resource, data=json.JSONEncoder().encode(request.data),
                                endpoint_filter=service,
                                headers={"Content-Type": "application/json",
                                         "Accept": "application/json"})
            elif(action == "patch"):
                resp = sess.patch(req_resource, data=json.JSONEncoder().encode(request.data),
                                  endpoint_filter=service,
                                headers={"Content-Type": "application/json",
                                         "Accept": "application/json"})
            elif (action == "delete"):
                resp = sess.delete(req_resource, endpoint_filter=service,
                                headers={"Content-Type": "application/json",
                                         "Accept": "application/json"})

            self._logger.info("service " + action + " response status> %s" % (resp.status_code))

            content = resp.json() if resp.content else None
            self._logger.debug("service " + action + " response content> %s" % (content))

            self._logger.info("RESP with status> %s" % resp.status_code)
            if (action == "delete"):
                return Response(headers={'X-Subject-Token': tmp_auth_token}, status=resp.status_code)
            else:
                #content = ProxyUtils.update_dnsaas_project_id(content, tenant_id)
                return Response(headers={'X-Subject-Token': tmp_auth_token}, data=content, status=resp.status_code)

        except VimDriverNewtonException as e:
            self._logger.error("Plugin exception> status:%s,error:%s"
                                  % (e.status_code, e.content))
            return Response(data={'error': e.content}, status=e.status_code)
        except HttpError as e:
            self._logger.error("HttpError: status:%s, response:%s" % (e.http_status, e.response.json()))
            return Response(data=e.response.json(), status=e.http_status)
        except Exception as e:
            self._logger.error(traceback.format_exc())
            return Response(data={'error': str(e)},
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)
Exemplo n.º 4
0
    def _do_action(self, action, request, vim_id, servicetype, requri):
        tmp_auth_token = self._get_token(request)
        try:
            #special handling of compute/v2 request from APPC, temp solution for A release
            if servicetype == 'compute':
                tmp_pattern = re.compile(r'^v2/(.+)')
                requri = tmp_pattern.sub(r'v2.1/' + r'\1', requri)


            vim = VimDriverUtils.get_vim_info(vim_id)
            # fetch the auth_state out of cache
            auth_state, metadata_catalog = VimDriverUtils.get_token_cache(tmp_auth_token)
            req_resource, metadata_catalog = self._get_resource_and_metadata(servicetype, metadata_catalog, requri)
            sess = VimDriverUtils.get_session(vim, auth_state=auth_state)

            cloud_owner, regionid = extsys.decode_vim_id(vim_id)
            interface = 'public'
            service = {
                'service_type': servicetype,
                'interface': interface,
                'region_name': vim['openstack_region_id']
                     if vim.get('openstack_region_id') else vim['cloud_region_id']
            }


            querystr = VimDriverUtils.get_query_part(request)
            if querystr:
                req_resource += "?" + querystr

            self._logger.info("service " + action + " request with uri %s,%s" % (req_resource, service))
            if(action == "get"):
                resp = sess.get(req_resource, endpoint_filter=service,
                                headers={"Content-Type": "application/json",
                                         "Accept": "application/json"})
            elif(action == "post"):
                resp = sess.post(req_resource, data=json.JSONEncoder().encode(request.data),
                                 endpoint_filter=service,
                                 headers={"Content-Type": "application/json",
                                          "Accept": "application/json"})
            elif(action == "put"):
                resp = sess.put(req_resource, data=json.JSONEncoder().encode(request.data),
                                endpoint_filter=service,
                                headers={"Content-Type": "application/json",
                                         "Accept": "application/json"})
            elif(action == "patch"):
                resp = sess.patch(req_resource, data=json.JSONEncoder().encode(request.data),
                                  endpoint_filter=service,
                                headers={"Content-Type": "application/json",
                                         "Accept": "application/json"})
            elif (action == "delete"):
                resp = sess.delete(req_resource, endpoint_filter=service,
                                headers={"Content-Type": "application/json",
                                         "Accept": "application/json"})
            content = resp.json() if resp.content else None
            self._logger.info("service " + action + " response status: %s" % (resp.status_code))
            self._logger.debug("service " + action + " response content: %s" % (content))

            if (action == "delete"):
                self._logger.info("RESP with status> %s" % resp.status_code)
                return Response(headers={'X-Subject-Token': tmp_auth_token}, status=resp.status_code)
            else:
                content = ProxyUtils.update_prefix(metadata_catalog, content)
                if (action == "get"):
                    if requri == '/v3/auth/catalog' and content and content.get("catalog"):
                        content['catalog'] = ProxyUtils.update_catalog_dnsaas(
                            vim_id, content['catalog'], self.proxy_prefix, vim)

                self._logger.info("RESP with status> %s" % resp.status_code)
                return Response(headers={'X-Subject-Token': tmp_auth_token},
                                data=content, status=resp.status_code)

        except VimDriverNewtonException as e:
            self._logger.error("Plugin exception> status:%s,error:%s"
                                  % (e.status_code, e.content))
            return Response(data={'error': e.content}, status=e.status_code)
        except HttpError as e:
            self._logger.error("HttpError: status:%s, response:%s" % (e.http_status, e.response.json()))
            return Response(data=e.response.json(), status=e.http_status)
        except Exception as e:
            self._logger.error(traceback.format_exc())
            return Response(data={'error': str(e)},
                            status=status.HTTP_500_INTERNAL_SERVER_ERROR)