{"action":"created","comment":{"url":"https://api.github.com/repos/cloudtools/stacker_blueprints/pulls/comments/211108987","pull_request_review_id":147464599,"id":211108987,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMTEwODk4Nw==","diff_hunk":"@@ -0,0 +1,283 @@\n+from stacker.blueprints.base import Blueprint\n+\n+from troposphere import (\n+    ec2,\n+    cloudwatch,\n+    elasticloadbalancingv2 as alb,\n+    Output,\n+    Tags,\n+)\n+\n+\n+class LoadBalancer(Blueprint):\n+\n+    VARIABLES = {\n+        'Name': {\n+            'type': str,\n+            'description': 'Specifies a name for the load balancer.'\n+        },\n+        'Scheme': {\n+            'type': str,\n+            'description': 'Specifies whether the load balancer is internal or '\n+                           'Internet-facing. Valid values are internet-facing '\n+                           'and internal. The default is internet-facing.'\n+        },\n+        'SecurityGroups': {\n+            'type': list,\n+            'description': 'Specifies a list of the IDs of the security groups '\n+                           'to assign to the load balancer.',\n+            'default': [],\n+        },\n+        'IngressRules': {\n+            'type': list,\n+            'description': 'A dict of ingress rules where the key is the '\n+                           'name of the rule to create.',\n+            'default': [],\n+        },\n+        'EgressRules': {\n+            'type': list,\n+            'description': 'A dict of ingress rules where the key is the '\n+                           'name of the rule to create.',\n+            'default': [],\n+        },\n+        'SubnetIds': {\n+            'type': list,\n+            'description': 'The subnets to attach to the load balancer, '\n+                           'specified as a list of subnet IDs. '\n+        },\n+        'Tags': {\n+            'type': dict,\n+            'description': 'Specifies an arbitrary set of tags (key-value pairs) '\n+                           'to associate with this load balancer. Use tags to manage '\n+                           'your resources.',\n+            'default': {},\n+        },\n+        'Type': {\n+            'type': str,\n+            'description': 'Specifies the type of load balancer to create.  Valid values '\n+                           'are application and network.The default is application.'\n+        },\n+        'IpAddressType': {\n+            'type': str,\n+            'description': 'The type of IP addresses that are used by the load balancers '\n+                           'subnets, such as ipv4 (for IPv4 addresses) or dualstack.'\n+        },\n+        'VpcId': {\n+            'type': str,\n+            'description': 'The physical ID of the VPC.'\n+        },\n+        'TargetGroups': {\n+            'type': list,\n+            'description': 'List of target groups to attach to the load balancer.'\n+        },\n+        'Listeners': {\n+            'type': list,\n+            'description': 'List of listeners for the load balancer.'\n+        },\n+        'Alarms': {\n+            'type': list,\n+            'description': 'List of alarms for the load balancer.'\n+        },\n+    }\n+\n+    def create_alarm(self, alarm_name, alarm):\n+        t = self.template\n+\n+        alarm.setdefault('Namespace', 'AWS/ApplicationELB')\n+        alarm_name = alarm_name.replace('_', '').replace('-', '')\n+\n+        alarm_resource = t.add_resource(\n+            cloudwatch.Alarm.from_dict(alarm_name, alarm)\n+        )\n+\n+        t.add_output(\n+            Output(alarm_name, Value=alarm_resource.Ref())\n+        )\n+\n+        t.add_output(\n+            Output(alarm_name + \"Arn\", Value=alarm_resource.GetAtt(\"Arn\"))\n+        )\n+\n+    def create_load_balancer(self):\n+        t = self.template\n+        v = self.get_variables()\n+\n+        ingress_rules = v['IngressRules']\n+        egress_rules = v['EgressRules']\n+        security_groups = v['SecurityGroups']\n+        tags = v['Tags']\n+        tags.setdefault('Name', v['Name'])\n+\n+        if ingress_rules or egress_rules:\n+            name = '{}-alb'.format(v['Name'])\n+            security_group = t.add_resource(\n+                ec2.SecurityGroup(\n+                    'SECGROUP',\n+                    GroupName=name,\n+                    GroupDescription='Security group for {}'.format(v['Name']),\n+                    SecurityGroupIngress=ingress_rules,\n+                    SecurityGroupEgress=egress_rules,\n+                    Tags=Tags({\n+                        'Name': name,\n+                    }),\n+                    VpcId=v['VpcId'],\n+                )\n+            )\n+            security_groups.append(security_group.Ref())\n+\n+        logical_name = 'ALB'\n+\n+        load_balancer = t.add_resource(\n+            alb.LoadBalancer(\n+                'ALB',\n+                Name=v['Name'],\n+                Scheme=v['Scheme'],\n+                IpAddressType=v['IpAddressType'],\n+                SecurityGroups=security_groups,\n+                Subnets=v['SubnetIds'],\n+                Tags=Tags(tags),\n+                Type=v['Type'],\n+            )\n+        )\n+\n+        alarms = v.get(\"Alarms\", [])\n+        for alarm in alarms:\n+            alarm_name = '{}Alarm{}'.format(logical_name, alarm['MetricName'])\n+\n+            alarm['Dimensions'] = [\n+                {\n+                    'Name': 'LoadBalancer',\n+                    'Value': load_balancer.GetAtt('LoadBalancerFullName'),\n+                },\n+            ]\n+\n+            self.create_alarm(alarm_name, alarm)\n+\n+        t.add_output(\n+            Output('LoadBalancerArn', Value=load_balancer.Ref())\n+        )\n+\n+        for attr in ('DNSName', 'CanonicalHostedZoneID', 'LoadBalancerFullName', 'LoadBalancerName'):\n+            t.add_output(\n+                Output(attr, Value=load_balancer.GetAtt(attr))\n+            )\n+\n+        return load_balancer\n+\n+    def create_target_groups(self, load_balancer):\n+        t = self.template\n+        v = self.get_variables()\n+        target_groups = {}\n+\n+        for tg in v['TargetGroups']:\n+            # target groups have a max length of 32 chars\n+            logical_name = 'TARGET{}'.format(tg['Port'])\n+            hc = tg['HealthCheck']\n+\n+            hc_attrs = {\n+                'HealthCheckIntervalSeconds': hc['IntervalSeconds'],\n+                'HealthCheckPath': hc['Path'],\n+                'HealthCheckTimeoutSeconds': hc['TimeoutSeconds'],\n+                'HealthyThresholdCount': hc['HealthyThresholdCount'],\n+                'UnhealthyThresholdCount': hc['UnhealthyThresholdCount'],\n+            }\n+\n+            hc_port = hc.get('Port')\n+            if hc_port:\n+                hc_attrs['HealthCheckPort'] = hc_port\n+\n+            hc_protocol = hc.get('Protocol')\n+            if hc_protocol:\n+                hc_attrs['HealthCheckProtocol'] = hc_protocol.upper()\n+\n+            tags = tg.get('Tags', {})\n+            tags.setdefault('Name', tg['Name'])\n+\n+            target_group = t.add_resource(\n+                alb.TargetGroup(\n+                    logical_name,\n+                    Matcher=alb.Matcher(\n+                        HttpCode=','.join(str(sc) for sc in hc['SuccessCodes'])\n+                    ),\n+                    Name=tg['Name'],","path":"stacker_blueprints/alb.py","position":202,"original_position":202,"commit_id":"356ae0cce03e7dc1716bacc6562b1eaa0c6463bc","original_commit_id":"356ae0cce03e7dc1716bacc6562b1eaa0c6463bc","user":{"login":"phobologic","id":517334,"node_id":"MDQ6VXNlcjUxNzMzNA==","avatar_url":"https://avatars2.githubusercontent.com/u/517334?v=4","gravatar_id":"","url":"https://api.github.com/users/phobologic","html_url":"https://github.com/phobologic","followers_url":"https://api.github.com/users/phobologic/followers","following_url":"https://api.github.com/users/phobologic/following{/other_user}","gists_url":"https://api.github.com/users/phobologic/gists{/gist_id}","starred_url":"https://api.github.com/users/phobologic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/phobologic/subscriptions","organizations_url":"https://api.github.com/users/phobologic/orgs","repos_url":"https://api.github.com/users/phobologic/repos","events_url":"https://api.github.com/users/phobologic/events{/privacy}","received_events_url":"https://api.github.com/users/phobologic/received_events","type":"User","site_admin":false},"body":"Again I'd remove the name","created_at":"2018-08-19T17:06:58Z","updated_at":"2018-08-19T17:14:44Z","html_url":"https://github.com/cloudtools/stacker_blueprints/pull/27#discussion_r211108987","pull_request_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/pulls/27","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/cloudtools/stacker_blueprints/pulls/comments/211108987"},"html":{"href":"https://github.com/cloudtools/stacker_blueprints/pull/27#discussion_r211108987"},"pull_request":{"href":"https://api.github.com/repos/cloudtools/stacker_blueprints/pulls/27"}}},"pull_request":{"url":"https://api.github.com/repos/cloudtools/stacker_blueprints/pulls/27","id":208138780,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA4MTM4Nzgw","html_url":"https://github.com/cloudtools/stacker_blueprints/pull/27","diff_url":"https://github.com/cloudtools/stacker_blueprints/pull/27.diff","patch_url":"https://github.com/cloudtools/stacker_blueprints/pull/27.patch","issue_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/issues/27","number":27,"state":"open","locked":false,"title":"ALB support","user":{"login":"dpetzold","id":103125,"node_id":"MDQ6VXNlcjEwMzEyNQ==","avatar_url":"https://avatars1.githubusercontent.com/u/103125?v=4","gravatar_id":"","url":"https://api.github.com/users/dpetzold","html_url":"https://github.com/dpetzold","followers_url":"https://api.github.com/users/dpetzold/followers","following_url":"https://api.github.com/users/dpetzold/following{/other_user}","gists_url":"https://api.github.com/users/dpetzold/gists{/gist_id}","starred_url":"https://api.github.com/users/dpetzold/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dpetzold/subscriptions","organizations_url":"https://api.github.com/users/dpetzold/orgs","repos_url":"https://api.github.com/users/dpetzold/repos","events_url":"https://api.github.com/users/dpetzold/events{/privacy}","received_events_url":"https://api.github.com/users/dpetzold/received_events","type":"User","site_admin":false},"body":"Support creating an ALB stack with target groups, listeners, security groups and alarms. A sample stack is defined below:\r\n\r\n```\r\n- class_path: stacker_blueprints.alb.LoadBalancer\r\n  description: Application load balancer for ${service}\r\n  name: ${service}-load-balancer\r\n  variables:\r\n    Name: ${namespace}-${service}\r\n    Scheme: internal\r\n    Type: application\r\n    IpAddressType: ipv4\r\n    TargetGroups:\r\n    - Name: ${namespace}-${service}-http\r\n      HealthCheck:\r\n        Port: 443\r\n        Protocol: https\r\n        IntervalSeconds: 10\r\n        Path: /healthcheck\r\n        TimeoutSeconds: 5\r\n        HealthyThresholdCount: 5\r\n        UnhealthyThresholdCount: 2\r\n        SuccessCodes:\r\n          - 200\r\n      Port: 80\r\n      Protocol: http\r\n      TargetType: instance\r\n    - Name: ${namespace}-${service}-https\r\n      HealthCheck:\r\n        IntervalSeconds: 10\r\n        Path: /healthcheck\r\n        TimeoutSeconds: 5\r\n        HealthyThresholdCount: 5\r\n        UnhealthyThresholdCount: 2\r\n        SuccessCodes:\r\n          - 200\r\n      Port: 443\r\n      Protocol: https\r\n      TargetType: instance\r\n      Alarms:\r\n      - ActionsEnabled: true\r\n        AlarmActions:\r\n          - ${alarm_sqs}\r\n        AlarmDescription: Unhealthy hosts\r\n        ComparisonOperator:  GreaterThanOrEqualToThreshold\r\n        EvaluationPeriods: 1\r\n        MetricName: UnHealthyHostCount\r\n        Period: 300\r\n        Statistic: Sum\r\n        Threshold: \"1\"\r\n    Listeners:\r\n    - DefaultActions:\r\n      - TargetGroup: ${namespace}-${service}-http\r\n        Type: forward\r\n      Port: 80\r\n      Protocol: HTTP\r\n    - Certificates:\r\n        - ${certificate_arn}\r\n      DefaultActions:\r\n      - TargetGroup: ${namespace}-${service}-https\r\n        Type: forward\r\n      Port: 443\r\n      Protocol: HTTPS\r\n    EgressRules:\r\n    - CidrIp: 0.0.0.0/0\r\n      FromPort: 0\r\n      ToPort: 0\r\n      IpProtocol: \"-1\"\r\n    IngressRules:\r\n    - CidrIp: 0.0.0.0/0\r\n      FromPort: 80\r\n      ToPort: 80\r\n      IpProtocol: tcp\r\n    - CidrIp: 0.0.0.0/0\r\n      FromPort: 443\r\n      ToPort: 443\r\n      IpProtocol: tcp\r\n    SubnetIds: ${private_subnets}\r\n    VpcId: ${vpc_id}\r\n    Alarms:\r\n    - ActionsEnabled: true\r\n      AlarmActions:\r\n        - ${alarm_sqs}\r\n      AlarmDescription: 500 error rate exceeded\r\n      ComparisonOperator:  GreaterThanOrEqualToThreshold\r\n      EvaluationPeriods: 1\r\n      MetricName: HTTPCode_Target_5XX_Count\r\n      Period: 300\r\n      Statistic: Average\r\n      Threshold: \"350\"\r\n    - ActionsEnabled: true\r\n      AlarmActions:\r\n        - ${alarm_sqs}\r\n      AlarmDescription: 400 error rate exceeded\r\n      ComparisonOperator:  GreaterThanOrEqualToThreshold\r\n      EvaluationPeriods: 1\r\n      MetricName: HTTPCode_Target_4XX_Count\r\n      Period: 300\r\n      Statistic: Average\r\n      Threshold: \"500\"\r\n```","created_at":"2018-08-14T00:23:59Z","updated_at":"2018-08-19T17:14:44Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a447803e5699c39d4fb13ddd2c781c9c4401e867","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/pulls/27/commits","review_comments_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/pulls/27/comments","review_comment_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/pulls/comments{/number}","comments_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/issues/27/comments","statuses_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/statuses/356ae0cce03e7dc1716bacc6562b1eaa0c6463bc","head":{"label":"ShopStyle:alb-support","ref":"alb-support","sha":"356ae0cce03e7dc1716bacc6562b1eaa0c6463bc","user":{"login":"ShopStyle","id":12091410,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyMDkxNDEw","avatar_url":"https://avatars1.githubusercontent.com/u/12091410?v=4","gravatar_id":"","url":"https://api.github.com/users/ShopStyle","html_url":"https://github.com/ShopStyle","followers_url":"https://api.github.com/users/ShopStyle/followers","following_url":"https://api.github.com/users/ShopStyle/following{/other_user}","gists_url":"https://api.github.com/users/ShopStyle/gists{/gist_id}","starred_url":"https://api.github.com/users/ShopStyle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ShopStyle/subscriptions","organizations_url":"https://api.github.com/users/ShopStyle/orgs","repos_url":"https://api.github.com/users/ShopStyle/repos","events_url":"https://api.github.com/users/ShopStyle/events{/privacy}","received_events_url":"https://api.github.com/users/ShopStyle/received_events","type":"Organization","site_admin":false},"repo":{"id":137917843,"node_id":"MDEwOlJlcG9zaXRvcnkxMzc5MTc4NDM=","name":"stacker_blueprints","full_name":"ShopStyle/stacker_blueprints","owner":{"login":"ShopStyle","id":12091410,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEyMDkxNDEw","avatar_url":"https://avatars1.githubusercontent.com/u/12091410?v=4","gravatar_id":"","url":"https://api.github.com/users/ShopStyle","html_url":"https://github.com/ShopStyle","followers_url":"https://api.github.com/users/ShopStyle/followers","following_url":"https://api.github.com/users/ShopStyle/following{/other_user}","gists_url":"https://api.github.com/users/ShopStyle/gists{/gist_id}","starred_url":"https://api.github.com/users/ShopStyle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ShopStyle/subscriptions","organizations_url":"https://api.github.com/users/ShopStyle/orgs","repos_url":"https://api.github.com/users/ShopStyle/repos","events_url":"https://api.github.com/users/ShopStyle/events{/privacy}","received_events_url":"https://api.github.com/users/ShopStyle/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ShopStyle/stacker_blueprints","description":"Standard library of blueprints for stacker","fork":true,"url":"https://api.github.com/repos/ShopStyle/stacker_blueprints","forks_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/forks","keys_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/teams","hooks_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/hooks","issue_events_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/issues/events{/number}","events_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/events","assignees_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/assignees{/user}","branches_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/branches{/branch}","tags_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/tags","blobs_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/git/refs{/sha}","trees_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/statuses/{sha}","languages_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/languages","stargazers_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/stargazers","contributors_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/contributors","subscribers_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/subscribers","subscription_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/subscription","commits_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/commits{/sha}","git_commits_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/git/commits{/sha}","comments_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/comments{/number}","issue_comment_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/issues/comments{/number}","contents_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/contents/{+path}","compare_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/merges","archive_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/downloads","issues_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/issues{/number}","pulls_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/pulls{/number}","milestones_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/milestones{/number}","notifications_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/labels{/name}","releases_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/releases{/id}","deployments_url":"https://api.github.com/repos/ShopStyle/stacker_blueprints/deployments","created_at":"2018-06-19T16:31:07Z","updated_at":"2018-06-27T20:08:12Z","pushed_at":"2018-08-15T17:22:18Z","git_url":"git://github.com/ShopStyle/stacker_blueprints.git","ssh_url":"git@github.com:ShopStyle/stacker_blueprints.git","clone_url":"https://github.com/ShopStyle/stacker_blueprints.git","svn_url":"https://github.com/ShopStyle/stacker_blueprints","homepage":null,"size":623,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":2,"license":{"key":"bsd-2-clause","name":"BSD 2-Clause \"Simplified\" License","spdx_id":"BSD-2-Clause","url":"https://api.github.com/licenses/bsd-2-clause","node_id":"MDc6TGljZW5zZTQ="},"forks":0,"open_issues":2,"watchers":0,"default_branch":"master"}},"base":{"label":"cloudtools:master","ref":"master","sha":"ee1ab8ef0e9a2e3e905c1af83682180a9ab01df8","user":{"login":"cloudtools","id":3028687,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMwMjg2ODc=","avatar_url":"https://avatars2.githubusercontent.com/u/3028687?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudtools","html_url":"https://github.com/cloudtools","followers_url":"https://api.github.com/users/cloudtools/followers","following_url":"https://api.github.com/users/cloudtools/following{/other_user}","gists_url":"https://api.github.com/users/cloudtools/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudtools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudtools/subscriptions","organizations_url":"https://api.github.com/users/cloudtools/orgs","repos_url":"https://api.github.com/users/cloudtools/repos","events_url":"https://api.github.com/users/cloudtools/events{/privacy}","received_events_url":"https://api.github.com/users/cloudtools/received_events","type":"Organization","site_admin":false},"repo":{"id":133464983,"node_id":"MDEwOlJlcG9zaXRvcnkxMzM0NjQ5ODM=","name":"stacker_blueprints","full_name":"cloudtools/stacker_blueprints","owner":{"login":"cloudtools","id":3028687,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMwMjg2ODc=","avatar_url":"https://avatars2.githubusercontent.com/u/3028687?v=4","gravatar_id":"","url":"https://api.github.com/users/cloudtools","html_url":"https://github.com/cloudtools","followers_url":"https://api.github.com/users/cloudtools/followers","following_url":"https://api.github.com/users/cloudtools/following{/other_user}","gists_url":"https://api.github.com/users/cloudtools/gists{/gist_id}","starred_url":"https://api.github.com/users/cloudtools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cloudtools/subscriptions","organizations_url":"https://api.github.com/users/cloudtools/orgs","repos_url":"https://api.github.com/users/cloudtools/repos","events_url":"https://api.github.com/users/cloudtools/events{/privacy}","received_events_url":"https://api.github.com/users/cloudtools/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/cloudtools/stacker_blueprints","description":"Standard library of blueprints for stacker","fork":true,"url":"https://api.github.com/repos/cloudtools/stacker_blueprints","forks_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/forks","keys_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/teams","hooks_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/hooks","issue_events_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/issues/events{/number}","events_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/events","assignees_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/assignees{/user}","branches_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/branches{/branch}","tags_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/tags","blobs_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/git/refs{/sha}","trees_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/statuses/{sha}","languages_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/languages","stargazers_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/stargazers","contributors_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/contributors","subscribers_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/subscribers","subscription_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/subscription","commits_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/commits{/sha}","git_commits_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/git/commits{/sha}","comments_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/comments{/number}","issue_comment_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/issues/comments{/number}","contents_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/contents/{+path}","compare_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/merges","archive_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/downloads","issues_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/issues{/number}","pulls_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/pulls{/number}","milestones_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/milestones{/number}","notifications_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/labels{/name}","releases_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/releases{/id}","deployments_url":"https://api.github.com/repos/cloudtools/stacker_blueprints/deployments","created_at":"2018-05-15T05:44:32Z","updated_at":"2018-08-14T05:04:15Z","pushed_at":"2018-08-15T17:56:00Z","git_url":"git://github.com/cloudtools/stacker_blueprints.git","ssh_url":"git@github.com:cloudtools/stacker_blueprints.git","clone_url":"https://github.com/cloudtools/stacker_blueprints.git","svn_url":"https://github.com/cloudtools/stacker_blueprints","homepage":null,"size":570,"stargazers_count":6,"watchers_count":6,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":6,"mirror_url":null,"archived":false,"open_issues_count":7,"license":{"key":"bsd-2-clause","name":"BSD 2-Clause \"Simplified\" License","spdx_id":"BSD-2-Clause","url":"https://api.github.com/licenses/bsd-2-clause","node_id":"MDc6TGljZW5zZTQ="},"forks":6,"open_issues":7,"watchers":6,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/cloudtools/stacker_blueprints/pulls/27"},"html":{"href":"https://github.com/cloudtools/stacker_blueprints/pull/27"},"issue":{"href":"https://api.github.com/repos/cloudtools/stacker_blueprints/issues/27"},"comments":{"href":"https://api.github.com/repos/cloudtools/stacker_blueprints/issues/27/comments"},"review_comments":{"href":"https://api.github.com/repos/cloudtools/stacker_blueprints/pulls/27/comments"},"review_comment":{"href":"https://api.github.com/repos/cloudtools/stacker_blueprints/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/cloudtools/stacker_blueprints/pulls/27/commits"},"statuses":{"href":"https://api.github.com/repos/cloudtools/stacker_blueprints/statuses/356ae0cce03e7dc1716bacc6562b1eaa0c6463bc"}},"author_association":"NONE"}}
{"actor":{"display_login":"phobologic"}}