{"action":"created","comment":{"url":"https://api.github.com/repos/oneconvergence/group-based-policy/pulls/comments/54835686","id":54835686,"diff_hunk":"@@ -0,0 +1,699 @@\n+# Copyright (c) 2016 OpenStack Foundation.\n+#\n+# Licensed under the Apache License, Version 2.0 (the \"License\");\n+# you may not use this file except in compliance with the License.\n+# You may obtain a copy of the License at\n+#\n+#    http://www.apache.org/licenses/LICENSE-2.0\n+#\n+# Unless required by applicable law or agreed to in writing, software\n+# distributed under the License is distributed on an \"AS IS\" BASIS,\n+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n+# implied.\n+# See the License for the specific language governing permissions and\n+# limitations under the License.\n+\n+import eventlet\n+from keystoneclient import exceptions as k_exceptions\n+from keystoneclient.v2_0 import client as keyclient\n+from neutron.common import exceptions as n_exc\n+from neutron.common import rpc as n_rpc\n+from neutron.db import model_base\n+from neutron.plugins.common import constants as pconst\n+from oslo_config import cfg\n+from oslo_log import log as logging\n+import oslo_messaging\n+from oslo_serialization import jsonutils\n+from oslo_utils import excutils\n+import sqlalchemy as sa\n+from sqlalchemy.orm.exc import NoResultFound\n+\n+from gbpservice.common import utils\n+from gbpservice.nfp.common import topics as nfp_rpc_topics\n+from gbpservice.neutron.services.servicechain.plugins.ncp import (\n+    exceptions as exc)\n+from gbpservice.neutron.services.servicechain.plugins.ncp import driver_base\n+from gbpservice.neutron.services.servicechain.plugins.ncp import model\n+from gbpservice.neutron.services.servicechain.plugins.ncp import plumber_base\n+\n+\n+NFP_NODE_DRIVER_OPTS = [\n+    cfg.StrOpt('svc_management_ptg_name',\n+               default='svc_management_ptg',\n+               help=_(\"Name of the PTG that is associated with the \"\n+                      \"service management network\")),\n+    cfg.BoolOpt('is_service_admin_owned',\n+                help=_(\"Parameter to indicate whether the Service VM has to \"\n+                       \"be owned by the Admin\"),\n+                default=False),\n+    cfg.IntOpt('service_create_timeout',\n+               default=600,\n+               help=_(\"Seconds to wait for service creation \"\n+                      \"to complete\")),\n+    cfg.IntOpt('service_delete_timeout',\n+               default=120,\n+               help=_(\"Seconds to wait for service deletion \"\n+                      \"to complete\")),\n+]\n+\n+cfg.CONF.register_opts(NFP_NODE_DRIVER_OPTS, \"nfp_node_driver\")\n+\n+SVC_MGMT_PTG_NAME = cfg.CONF.nfp_node_driver.svc_management_ptg_name\n+\n+\n+LOG = logging.getLogger(__name__)\n+\n+\n+class InvalidServiceType(exc.NodeCompositionPluginBadRequest):\n+    message = _(\"The NFP Node driver only supports the services \"\n+                \"VPN, Firewall and LB in a Service Chain\")\n+\n+\n+class ServiceProfileRequired(exc.NodeCompositionPluginBadRequest):\n+    message = _(\"A Service profile is required in Service node\")\n+\n+\n+class NodeVendorMismatch(exc.NodeCompositionPluginBadRequest):\n+    message = _(\"The NFP Node driver only handles nodes which have service \"\n+                \"profile with vendor name %(vendor)s\")\n+\n+\n+class DuplicateServiceTypeInChain(exc.NodeCompositionPluginBadRequest):\n+    message = _(\"The NFP Node driver does not support duplicate \"\n+                \"service types in same chain\")\n+\n+\n+class RequiredProfileAttributesNotSet(exc.NodeCompositionPluginBadRequest):\n+    message = _(\"The required attributes in service profile are not present\")\n+\n+\n+class InvalidNodeOrderInChain(exc.NodeCompositionPluginBadRequest):\n+    message = _(\"The NFP Node driver does not support the order \"\n+                \"of nodes defined in the current service chain spec\")\n+\n+\n+class UnSupportedServiceProfile(exc.NodeCompositionPluginBadRequest):\n+    message = _(\"The NFP Node driver does not support this service \"\n+                \"profile with service type %(service_type)s and vendor \"\n+                \"%(vendor)s\")\n+\n+\n+class UnSupportedInsertionMode(exc.NodeCompositionPluginBadRequest):\n+    message = _(\"The NFP Node driver supports only L3 Insertion \"\n+                \"mode\")\n+\n+\n+class ServiceInfoNotAvailableOnUpdate(n_exc.NeutronException):\n+    message = _(\"Service information is not available with Service Manager \"\n+                \"on node update\")\n+\n+\n+class VipNspNotSetonProvider(n_exc.NeutronException):\n+    message = _(\"Network Service policy for VIP IP address is not configured \"\n+                \"on the Providing Group\")\n+\n+\n+class NodeInstanceDeleteFailed(n_exc.NeutronException):\n+    message = _(\"Node instance delete failed in NFP Node driver\")\n+\n+\n+class NodeInstanceCreateFailed(n_exc.NeutronException):\n+    message = _(\"Node instance create failed in NFP Node driver\")\n+\n+\n+class ServiceNodeInstanceNetworkFunctionMapping(model_base.BASEV2):\n+    \"\"\"ServiceChainInstance to NFP network function mapping.\"\"\"\n+\n+    __tablename__ = 'ncp_node_instance_network_function_mappings'\n+    sc_instance_id = sa.Column(sa.String(36),\n+                               nullable=False, primary_key=True)\n+    sc_node_id = sa.Column(sa.String(36),\n+                           nullable=False, primary_key=True)\n+    network_function_id = sa.Column(sa.String(36),\n+                                   nullable=False, primary_key=True)\n+\n+\n+# These callback apis are not used today, This is supposed to be used when\n+# GBP supports asynchronous operations\n+class NFPCallbackApi(object):\n+    RPC_API_VERSION = \"1.0\"\n+    target = oslo_messaging.Target(version=RPC_API_VERSION)\n+\n+    def __init__(self, node_driver):\n+        self.node_driver = node_driver\n+\n+    def network_function_created(self, context, network_function):\n+        pass\n+\n+    def network_function_deleted(self, context, network_function):\n+        pass\n+\n+\n+class NFPClientApi(object):\n+    \"\"\" Client side of the NFP Framework user \"\"\"\n+\n+    RPC_API_VERSION = '1.0'\n+\n+    def __init__(self, topic):\n+        target = oslo_messaging.Target(\n+            topic=topic, version=self.RPC_API_VERSION)\n+        self.client = n_rpc.get_client(target)\n+\n+    def create_network_function(self, context, network_function):\n+        cctxt = self.client.prepare(\n+            fanout=False, topic=nfp_rpc_topics.NFP_SERVICE_LCM_TOPIC)\n+        return cctxt.call(\n+            context,\n+            'create_network_function',\n+            network_function=network_function)\n+        # cctxt.cast(context, 'create_service', service_info=service_info)\n+\n+    def delete_network_function(self, context, network_function_id):\n+        cctxt = self.client.prepare(version=self.RPC_API_VERSION)\n+        return cctxt.call(\n+            context,\n+            'delete_network_function',\n+            network_function_id=network_function_id)\n+\n+    def get_network_function(self, context, network_function_id):\n+        cctxt = self.client.prepare(version=self.RPC_API_VERSION)\n+        return cctxt.call(\n+            context,\n+            'get_network_function',\n+            network_function_id=network_function_id)\n+\n+    def consumer_ptg_added_notification(self, context, network_function_id,\n+                                        policy_target_group):\n+        cctxt = self.client.prepare(version=self.RPC_API_VERSION)\n+        cctxt.cast(context, 'consumer_ptg_added_notification', network_function_id=network_function_id, policy_target_group=policy_target_group)\n+        '''\n+        return cctxt.call(\n+            context,\n+            'consumer_ptg_added_notification',\n+            network_function_id=network_function_id,\n+            policy_target_group=policy_target_group)\n+        '''\n+\n+    def consumer_ptg_removed_notification(self, context, network_function_id,\n+                                          policy_target_group):\n+        cctxt = self.client.prepare(version=self.RPC_API_VERSION)\n+        cctxt.cast(context, 'consumer_ptg_removed_notification', network_function_id=network_function_id, policy_target_group=policy_target_group)\n+        '''\n+        return cctxt.call(\n+            context,\n+            'consumer_ptg_removed_notification',\n+            network_function_id=network_function_id,\n+            policy_target_group=policy_target_group)\n+        '''\n+\n+    def policy_target_added_notification(self, context, network_function_id,\n+                                         policy_target):\n+        cctxt = self.client.prepare(version=self.RPC_API_VERSION)\n+        cctxt.cast(context, 'policy_target_added_notification', network_function_id=network_function_id, policy_target=policy_target)\n+        '''\n+        return cctxt.call(\n+            context,\n+            'policy_target_added_notification',\n+            network_function_id=network_function_id,\n+            policy_target=policy_target)\n+        '''\n+\n+    def policy_target_removed_notification(self, context, network_function_id,\n+                                           policy_target):\n+        cctxt = self.client.prepare(version=self.RPC_API_VERSION)\n+        cctxt.cast(context, 'policy_target_removed_notification', network_function_id=network_function_id, policy_target=policy_target)\n+        '''\n+        return cctxt.call(\n+            context,\n+            'policy_target_removed_notification',\n+            network_function_id=network_function_id,\n+            policy_target=policy_target)\n+        '''\n+\n+\n+class NFPNodeDriver(driver_base.NodeDriverBase):\n+    SUPPORTED_SERVICE_TYPES = [\n+        pconst.LOADBALANCER, pconst.FIREWALL, pconst.VPN]\n+    SUPPORTED_SERVICE_VENDOR_MAPPING = {\n+        pconst.LOADBALANCER: [\"haproxy\"],\n+        pconst.FIREWALL: [\"vyos\"],\n+        pconst.VPN: [\"vyos\"],\n+    }\n+    vendor_name = 'NFP'\n+    required_heat_resources = {\n+        pconst.LOADBALANCER: ['OS::Neutron::LoadBalancer',\n+                              'OS::Neutron::Pool'],\n+        pconst.FIREWALL: ['OS::Neutron::Firewall',\n+                          'OS::Neutron::FirewallPolicy'],\n+        pconst.VPN: ['OS::Neutron::VPNService'],\n+    }\n+    initialized = False\n+\n+    def __init__(self):\n+        super(NFPNodeDriver, self).__init__()\n+        self._lbaas_plugin = None\n+\n+    @property\n+    def name(self):\n+        return self._name\n+\n+    def initialize(self, name):\n+        self.initialized = True\n+        self._name = name\n+        if cfg.CONF.nfp_node_driver.is_service_admin_owned:\n+            self.resource_owner_tenant_id = self._resource_owner_tenant_id()\n+        else:\n+            self.resource_owner_tenant_id = None\n+        self._setup_rpc_listeners()\n+        self._setup_rpc()\n+\n+    def _setup_rpc_listeners(self):\n+        self.endpoints = [NFPCallbackApi(self)]\n+        self.topic = nfp_rpc_topics.NFP_NODE_DRIVER_CALLBACK_TOPIC\n+        self.conn = n_rpc.create_connection(new=True)\n+        self.conn.create_consumer(self.topic, self.endpoints, fanout=False)\n+        return self.conn.consume_in_threads()\n+\n+    def _setup_rpc(self):\n+        self.nfp_notifier = NFPClientApi(nfp_rpc_topics.NFP_SERVICE_LCM_TOPIC)\n+\n+    def get_plumbing_info(self, context):\n+        context._plugin_context = self._get_resource_owner_context(\n+            context._plugin_context)\n+        service_type = context.current_profile['service_type']\n+\n+        # Management PTs are managed by NFP since it supports hosting multiple\n+        # logical services in a single device\n+        plumbing_request = {'management': [], 'provider': [{}],","path":"gbpservice/neutron/services/servicechain/plugins/ncp/node_drivers/nfp_node_driver.py","position":287,"original_position":287,"commit_id":"e2b988dcf3b3f50f7fb7268b6564f082c2806bb9","original_commit_id":"e2b988dcf3b3f50f7fb7268b6564f082c2806bb9","user":{"login":"mageshgv-oc","id":10354859,"avatar_url":"https://avatars.githubusercontent.com/u/10354859?v=3","gravatar_id":"","url":"https://api.github.com/users/mageshgv-oc","html_url":"https://github.com/mageshgv-oc","followers_url":"https://api.github.com/users/mageshgv-oc/followers","following_url":"https://api.github.com/users/mageshgv-oc/following{/other_user}","gists_url":"https://api.github.com/users/mageshgv-oc/gists{/gist_id}","starred_url":"https://api.github.com/users/mageshgv-oc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mageshgv-oc/subscriptions","organizations_url":"https://api.github.com/users/mageshgv-oc/orgs","repos_url":"https://api.github.com/users/mageshgv-oc/repos","events_url":"https://api.github.com/users/mageshgv-oc/events{/privacy}","received_events_url":"https://api.github.com/users/mageshgv-oc/received_events","type":"User","site_admin":false},"body":"The node driver passes it to NFP","created_at":"2016-03-03T04:44:53Z","updated_at":"2016-03-03T04:44:53Z","html_url":"https://github.com/oneconvergence/group-based-policy/pull/76#discussion_r54835686","pull_request_url":"https://api.github.com/repos/oneconvergence/group-based-policy/pulls/76","_links":{"self":{"href":"https://api.github.com/repos/oneconvergence/group-based-policy/pulls/comments/54835686"},"html":{"href":"https://github.com/oneconvergence/group-based-policy/pull/76#discussion_r54835686"},"pull_request":{"href":"https://api.github.com/repos/oneconvergence/group-based-policy/pulls/76"}}},"pull_request":{"url":"https://api.github.com/repos/oneconvergence/group-based-policy/pulls/76","id":61199004,"html_url":"https://github.com/oneconvergence/group-based-policy/pull/76","diff_url":"https://github.com/oneconvergence/group-based-policy/pull/76.diff","patch_url":"https://github.com/oneconvergence/group-based-policy/pull/76.patch","issue_url":"https://api.github.com/repos/oneconvergence/group-based-policy/issues/76","number":76,"state":"open","locked":false,"title":"Rebase orchestrator","user":{"login":"mageshgv-oc","id":10354859,"avatar_url":"https://avatars.githubusercontent.com/u/10354859?v=3","gravatar_id":"","url":"https://api.github.com/users/mageshgv-oc","html_url":"https://github.com/mageshgv-oc","followers_url":"https://api.github.com/users/mageshgv-oc/followers","following_url":"https://api.github.com/users/mageshgv-oc/following{/other_user}","gists_url":"https://api.github.com/users/mageshgv-oc/gists{/gist_id}","starred_url":"https://api.github.com/users/mageshgv-oc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mageshgv-oc/subscriptions","organizations_url":"https://api.github.com/users/mageshgv-oc/orgs","repos_url":"https://api.github.com/users/mageshgv-oc/repos","events_url":"https://api.github.com/users/mageshgv-oc/events{/privacy}","received_events_url":"https://api.github.com/users/mageshgv-oc/received_events","type":"User","site_admin":false},"body":"Orchestrator code (includes framework commits)","created_at":"2016-03-01T06:26:48Z","updated_at":"2016-03-03T04:44:53Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8609036ab017d574c68d0e9b3cd2dde0e696b745","assignee":{"login":"hemanthravi","id":1445038,"avatar_url":"https://avatars.githubusercontent.com/u/1445038?v=3","gravatar_id":"","url":"https://api.github.com/users/hemanthravi","html_url":"https://github.com/hemanthravi","followers_url":"https://api.github.com/users/hemanthravi/followers","following_url":"https://api.github.com/users/hemanthravi/following{/other_user}","gists_url":"https://api.github.com/users/hemanthravi/gists{/gist_id}","starred_url":"https://api.github.com/users/hemanthravi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hemanthravi/subscriptions","organizations_url":"https://api.github.com/users/hemanthravi/orgs","repos_url":"https://api.github.com/users/hemanthravi/repos","events_url":"https://api.github.com/users/hemanthravi/events{/privacy}","received_events_url":"https://api.github.com/users/hemanthravi/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/oneconvergence/group-based-policy/pulls/76/commits","review_comments_url":"https://api.github.com/repos/oneconvergence/group-based-policy/pulls/76/comments","review_comment_url":"https://api.github.com/repos/oneconvergence/group-based-policy/pulls/comments{/number}","comments_url":"https://api.github.com/repos/oneconvergence/group-based-policy/issues/76/comments","statuses_url":"https://api.github.com/repos/oneconvergence/group-based-policy/statuses/e2b988dcf3b3f50f7fb7268b6564f082c2806bb9","head":{"label":"oneconvergence:rebase_orchestrator","ref":"rebase_orchestrator","sha":"e2b988dcf3b3f50f7fb7268b6564f082c2806bb9","user":{"login":"oneconvergence","id":8160602,"avatar_url":"https://avatars.githubusercontent.com/u/8160602?v=3","gravatar_id":"","url":"https://api.github.com/users/oneconvergence","html_url":"https://github.com/oneconvergence","followers_url":"https://api.github.com/users/oneconvergence/followers","following_url":"https://api.github.com/users/oneconvergence/following{/other_user}","gists_url":"https://api.github.com/users/oneconvergence/gists{/gist_id}","starred_url":"https://api.github.com/users/oneconvergence/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oneconvergence/subscriptions","organizations_url":"https://api.github.com/users/oneconvergence/orgs","repos_url":"https://api.github.com/users/oneconvergence/repos","events_url":"https://api.github.com/users/oneconvergence/events{/privacy}","received_events_url":"https://api.github.com/users/oneconvergence/received_events","type":"Organization","site_admin":false},"repo":{"id":34099604,"name":"group-based-policy","full_name":"oneconvergence/group-based-policy","owner":{"login":"oneconvergence","id":8160602,"avatar_url":"https://avatars.githubusercontent.com/u/8160602?v=3","gravatar_id":"","url":"https://api.github.com/users/oneconvergence","html_url":"https://github.com/oneconvergence","followers_url":"https://api.github.com/users/oneconvergence/followers","following_url":"https://api.github.com/users/oneconvergence/following{/other_user}","gists_url":"https://api.github.com/users/oneconvergence/gists{/gist_id}","starred_url":"https://api.github.com/users/oneconvergence/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oneconvergence/subscriptions","organizations_url":"https://api.github.com/users/oneconvergence/orgs","repos_url":"https://api.github.com/users/oneconvergence/repos","events_url":"https://api.github.com/users/oneconvergence/events{/privacy}","received_events_url":"https://api.github.com/users/oneconvergence/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/oneconvergence/group-based-policy","description":"Group Based Policy","fork":true,"url":"https://api.github.com/repos/oneconvergence/group-based-policy","forks_url":"https://api.github.com/repos/oneconvergence/group-based-policy/forks","keys_url":"https://api.github.com/repos/oneconvergence/group-based-policy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/oneconvergence/group-based-policy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/oneconvergence/group-based-policy/teams","hooks_url":"https://api.github.com/repos/oneconvergence/group-based-policy/hooks","issue_events_url":"https://api.github.com/repos/oneconvergence/group-based-policy/issues/events{/number}","events_url":"https://api.github.com/repos/oneconvergence/group-based-policy/events","assignees_url":"https://api.github.com/repos/oneconvergence/group-based-policy/assignees{/user}","branches_url":"https://api.github.com/repos/oneconvergence/group-based-policy/branches{/branch}","tags_url":"https://api.github.com/repos/oneconvergence/group-based-policy/tags","blobs_url":"https://api.github.com/repos/oneconvergence/group-based-policy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/oneconvergence/group-based-policy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/oneconvergence/group-based-policy/git/refs{/sha}","trees_url":"https://api.github.com/repos/oneconvergence/group-based-policy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/oneconvergence/group-based-policy/statuses/{sha}","languages_url":"https://api.github.com/repos/oneconvergence/group-based-policy/languages","stargazers_url":"https://api.github.com/repos/oneconvergence/group-based-policy/stargazers","contributors_url":"https://api.github.com/repos/oneconvergence/group-based-policy/contributors","subscribers_url":"https://api.github.com/repos/oneconvergence/group-based-policy/subscribers","subscription_url":"https://api.github.com/repos/oneconvergence/group-based-policy/subscription","commits_url":"https://api.github.com/repos/oneconvergence/group-based-policy/commits{/sha}","git_commits_url":"https://api.github.com/repos/oneconvergence/group-based-policy/git/commits{/sha}","comments_url":"https://api.github.com/repos/oneconvergence/group-based-policy/comments{/number}","issue_comment_url":"https://api.github.com/repos/oneconvergence/group-based-policy/issues/comments{/number}","contents_url":"https://api.github.com/repos/oneconvergence/group-based-policy/contents/{+path}","compare_url":"https://api.github.com/repos/oneconvergence/group-based-policy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/oneconvergence/group-based-policy/merges","archive_url":"https://api.github.com/repos/oneconvergence/group-based-policy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/oneconvergence/group-based-policy/downloads","issues_url":"https://api.github.com/repos/oneconvergence/group-based-policy/issues{/number}","pulls_url":"https://api.github.com/repos/oneconvergence/group-based-policy/pulls{/number}","milestones_url":"https://api.github.com/repos/oneconvergence/group-based-policy/milestones{/number}","notifications_url":"https://api.github.com/repos/oneconvergence/group-based-policy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/oneconvergence/group-based-policy/labels{/name}","releases_url":"https://api.github.com/repos/oneconvergence/group-based-policy/releases{/id}","deployments_url":"https://api.github.com/repos/oneconvergence/group-based-policy/deployments","created_at":"2015-04-17T06:06:34Z","updated_at":"2016-02-19T14:46:42Z","pushed_at":"2016-03-02T17:21:08Z","git_url":"git://github.com/oneconvergence/group-based-policy.git","ssh_url":"git@github.com:oneconvergence/group-based-policy.git","clone_url":"https://github.com/oneconvergence/group-based-policy.git","svn_url":"https://github.com/oneconvergence/group-based-policy","homepage":"http://openstack.org","size":5013,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":13,"forks":3,"open_issues":13,"watchers":0,"default_branch":"oneconvergence_service_node_driver"}},"base":{"label":"oneconvergence:sc_opensource_integration","ref":"sc_opensource_integration","sha":"c806a88f3fa172e5fa94f3e58fb074a83e6ad966","user":{"login":"oneconvergence","id":8160602,"avatar_url":"https://avatars.githubusercontent.com/u/8160602?v=3","gravatar_id":"","url":"https://api.github.com/users/oneconvergence","html_url":"https://github.com/oneconvergence","followers_url":"https://api.github.com/users/oneconvergence/followers","following_url":"https://api.github.com/users/oneconvergence/following{/other_user}","gists_url":"https://api.github.com/users/oneconvergence/gists{/gist_id}","starred_url":"https://api.github.com/users/oneconvergence/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oneconvergence/subscriptions","organizations_url":"https://api.github.com/users/oneconvergence/orgs","repos_url":"https://api.github.com/users/oneconvergence/repos","events_url":"https://api.github.com/users/oneconvergence/events{/privacy}","received_events_url":"https://api.github.com/users/oneconvergence/received_events","type":"Organization","site_admin":false},"repo":{"id":34099604,"name":"group-based-policy","full_name":"oneconvergence/group-based-policy","owner":{"login":"oneconvergence","id":8160602,"avatar_url":"https://avatars.githubusercontent.com/u/8160602?v=3","gravatar_id":"","url":"https://api.github.com/users/oneconvergence","html_url":"https://github.com/oneconvergence","followers_url":"https://api.github.com/users/oneconvergence/followers","following_url":"https://api.github.com/users/oneconvergence/following{/other_user}","gists_url":"https://api.github.com/users/oneconvergence/gists{/gist_id}","starred_url":"https://api.github.com/users/oneconvergence/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oneconvergence/subscriptions","organizations_url":"https://api.github.com/users/oneconvergence/orgs","repos_url":"https://api.github.com/users/oneconvergence/repos","events_url":"https://api.github.com/users/oneconvergence/events{/privacy}","received_events_url":"https://api.github.com/users/oneconvergence/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/oneconvergence/group-based-policy","description":"Group Based Policy","fork":true,"url":"https://api.github.com/repos/oneconvergence/group-based-policy","forks_url":"https://api.github.com/repos/oneconvergence/group-based-policy/forks","keys_url":"https://api.github.com/repos/oneconvergence/group-based-policy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/oneconvergence/group-based-policy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/oneconvergence/group-based-policy/teams","hooks_url":"https://api.github.com/repos/oneconvergence/group-based-policy/hooks","issue_events_url":"https://api.github.com/repos/oneconvergence/group-based-policy/issues/events{/number}","events_url":"https://api.github.com/repos/oneconvergence/group-based-policy/events","assignees_url":"https://api.github.com/repos/oneconvergence/group-based-policy/assignees{/user}","branches_url":"https://api.github.com/repos/oneconvergence/group-based-policy/branches{/branch}","tags_url":"https://api.github.com/repos/oneconvergence/group-based-policy/tags","blobs_url":"https://api.github.com/repos/oneconvergence/group-based-policy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/oneconvergence/group-based-policy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/oneconvergence/group-based-policy/git/refs{/sha}","trees_url":"https://api.github.com/repos/oneconvergence/group-based-policy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/oneconvergence/group-based-policy/statuses/{sha}","languages_url":"https://api.github.com/repos/oneconvergence/group-based-policy/languages","stargazers_url":"https://api.github.com/repos/oneconvergence/group-based-policy/stargazers","contributors_url":"https://api.github.com/repos/oneconvergence/group-based-policy/contributors","subscribers_url":"https://api.github.com/repos/oneconvergence/group-based-policy/subscribers","subscription_url":"https://api.github.com/repos/oneconvergence/group-based-policy/subscription","commits_url":"https://api.github.com/repos/oneconvergence/group-based-policy/commits{/sha}","git_commits_url":"https://api.github.com/repos/oneconvergence/group-based-policy/git/commits{/sha}","comments_url":"https://api.github.com/repos/oneconvergence/group-based-policy/comments{/number}","issue_comment_url":"https://api.github.com/repos/oneconvergence/group-based-policy/issues/comments{/number}","contents_url":"https://api.github.com/repos/oneconvergence/group-based-policy/contents/{+path}","compare_url":"https://api.github.com/repos/oneconvergence/group-based-policy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/oneconvergence/group-based-policy/merges","archive_url":"https://api.github.com/repos/oneconvergence/group-based-policy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/oneconvergence/group-based-policy/downloads","issues_url":"https://api.github.com/repos/oneconvergence/group-based-policy/issues{/number}","pulls_url":"https://api.github.com/repos/oneconvergence/group-based-policy/pulls{/number}","milestones_url":"https://api.github.com/repos/oneconvergence/group-based-policy/milestones{/number}","notifications_url":"https://api.github.com/repos/oneconvergence/group-based-policy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/oneconvergence/group-based-policy/labels{/name}","releases_url":"https://api.github.com/repos/oneconvergence/group-based-policy/releases{/id}","deployments_url":"https://api.github.com/repos/oneconvergence/group-based-policy/deployments","created_at":"2015-04-17T06:06:34Z","updated_at":"2016-02-19T14:46:42Z","pushed_at":"2016-03-02T17:21:08Z","git_url":"git://github.com/oneconvergence/group-based-policy.git","ssh_url":"git@github.com:oneconvergence/group-based-policy.git","clone_url":"https://github.com/oneconvergence/group-based-policy.git","svn_url":"https://github.com/oneconvergence/group-based-policy","homepage":"http://openstack.org","size":5013,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":13,"forks":3,"open_issues":13,"watchers":0,"default_branch":"oneconvergence_service_node_driver"}},"_links":{"self":{"href":"https://api.github.com/repos/oneconvergence/group-based-policy/pulls/76"},"html":{"href":"https://github.com/oneconvergence/group-based-policy/pull/76"},"issue":{"href":"https://api.github.com/repos/oneconvergence/group-based-policy/issues/76"},"comments":{"href":"https://api.github.com/repos/oneconvergence/group-based-policy/issues/76/comments"},"review_comments":{"href":"https://api.github.com/repos/oneconvergence/group-based-policy/pulls/76/comments"},"review_comment":{"href":"https://api.github.com/repos/oneconvergence/group-based-policy/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/oneconvergence/group-based-policy/pulls/76/commits"},"statuses":{"href":"https://api.github.com/repos/oneconvergence/group-based-policy/statuses/e2b988dcf3b3f50f7fb7268b6564f082c2806bb9"}}}}