{"action":"created","comment":{"url":"https://api.github.com/repos/openshift/console/pulls/comments/229381002","pull_request_review_id":169863322,"id":229381002,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyOTM4MTAwMg==","diff_hunk":"@@ -0,0 +1,368 @@\n+/* eslint-disable no-undef */\n+import * as _ from 'lodash-es';\n+import * as React from 'react';\n+import { Helmet } from 'react-helmet';\n+\n+import { connectToPlural } from '../../kinds';\n+import { k8sCreate, K8sKind, referenceFor } from '../../module/k8s';\n+import { ButtonBar, history, LoadingBox, NameValueEditor, resourceObjPath, RequestSizeInput } from '../utils';\n+import { ListDropdown } from '../RBAC/bindings';\n+import { RadioInput } from '../radio';\n+import { Checkbox } from '../checkbox';\n+\n+const StorageClassDropdown: React.SFC<StorageClassDropdownProps> = props => {\n+  const kind = 'StorageClass';\n+  const resources = [{ kind }];\n+  const { selectedKey, required, namespace } = props;\n+  return (\n+    <ListDropdown\n+      {...props}\n+      desc=\"Storage Classes\"\n+      resources={resources}\n+      selectedKeyKind={kind}\n+      placeholder=\"Select storage class\"\n+      selectedKey={selectedKey}\n+      required={required}\n+      namespace={namespace}\n+      name={name}\n+    />\n+  );\n+};\n+// This form is done a little odd since it is used in both its own page and as\n+// a sub form inside the attach storage page.\n+export class CreatePvcForm extends React.Component<CreatePvcFormProps, CreatePvcFormState> {\n+  constructor(props) {\n+    super(props);\n+\n+    this.state = {\n+      storageClass: '',\n+      pvcName: '',\n+      accessMode: 'ReadWriteOnce',\n+      requestSizeValue: '1',\n+      requestSizeUnit: 'Gi',\n+      disableForm: false,\n+      showLabelSelectors: false,\n+      nameValuePairs: [['', '']],\n+      radios: [\n+        {\n+          value: 'ReadWriteOnce',\n+          title: 'Single User (RWO)',\n+        },\n+        {\n+          value: 'ReadWriteMany',\n+          title: 'Shared Access (RWX)',\n+        },\n+        {\n+          value: 'ReadOnlyMany',\n+          title: 'Read Only (ROX)',\n+        },\n+      ],\n+      dropdownUnits: {\n+        Mi: 'MiB',\n+        Gi: 'GiB',\n+        Ti: 'TiB',\n+      },\n+    };\n+  }\n+\n+  handleChange: React.ReactEventHandler<HTMLInputElement> = event => {\n+    // this handles pvcName, accessMode, size\n+    const { name, value } = event.currentTarget;\n+    this.setState({ [name]: value } as any, () => {\n+      this.onChange();\n+    });\n+  };\n+\n+  handleNameValuePairs = ({ nameValuePairs }) => {\n+    this.setState({ nameValuePairs }, () => {\n+      this.onChange();\n+    });\n+  };\n+\n+  handleStorageClass = storageClass => {\n+    this.setState({ storageClass }, () => {\n+      this.onChange();\n+    });\n+  };\n+\n+  handleClear = () => {\n+    this.setState({ storageClass: '' }, () => {\n+      this.onChange();\n+    });\n+  };\n+\n+  toggleShowLabelSelectors = () => {\n+    this.setState({ showLabelSelectors: !this.state.showLabelSelectors });\n+  };\n+\n+  onFormDisable = disableForm => {\n+    this.setState({ disableForm });\n+  };\n+\n+  nameValueArrayToObject = nvpArray => {\n+    return _.reduce(nvpArray, (acc, [key, value]) => {\n+      return key && value ? { ...acc, [key]: value } : acc;\n+    }, {});\n+  };\n+\n+  onChange = () => {\n+    return this.props.onChange(this.updatePvc());\n+  }\n+\n+  updatePvc = () => {\n+    const { namespace } = this.props;\n+    const { pvcName, accessMode, requestSizeValue, requestSizeUnit, storageClass, nameValuePairs } = this.state;\n+    const valuePairs = this.nameValueArrayToObject(nameValuePairs);\n+\n+    const obj = {\n+      apiVersion: 'v1',\n+      kind: 'PersistentVolumeClaim',\n+      metadata: {\n+        name: pvcName,\n+        namespace: namespace,\n+        annotations: {},\n+      },\n+      spec: {\n+        accessModes: [accessMode],\n+        storageClassName: (storageClass && storageClass !== 'No Storage Class') ? storageClass : '',\n+        resources: {\n+          requests: {\n+            storage: `${requestSizeValue}${requestSizeUnit}`,\n+          },\n+        },\n+        selector: {\n+          matchLabels: valuePairs,\n+        },\n+      },\n+    };\n+    return obj;\n+  };\n+\n+  render() {\n+    const { dropdownUnits, showLabelSelectors, nameValuePairs, requestSizeUnit, requestSizeValue, storageClass } = this.state;\n+    const { namespace } = this.props;\n+    const Clear = () => <span className=\"form-group btn btn-link\" onClick={this.handleClear}> Clear Selection</span>;\n+\n+    return (\n+      <div>\n+        <label className=\"control-label\" htmlFor=\"storageclass-dropdown\">\n+          Storage Class\n+        </label>\n+        <div className=\"form-group\">\n+          <StorageClassDropdown\n+            onChange={this.handleStorageClass}\n+            id=\"storageclass-dropdown\"\n+            selectedKey={storageClass}\n+            namespace={namespace}\n+            required={false}\n+            name=\"storageClass\"\n+            placeholder=\"Select storage class\"\n+          />\n+          {storageClass && <Clear />}\n+        </div>\n+        <p className=\"form-text text-muted\" id=\"storageclass-dropdown-help\">\n+          Optional: Select storage class to associate with this new claim.\n+        </p>\n+        <label className=\"control-label co-required\" htmlFor=\"pvc-name\">\n+          Name\n+        </label>\n+        <div className=\"form-group\">\n+          <input\n+            className=\"form-control\"\n+            type=\"text\"\n+            onChange={this.handleChange}\n+            placeholder=\"my-storage-claim\"\n+            aria-describedby=\"pvc-name-help\"\n+            id=\"pvc-name\"\n+            name=\"pvcName\"\n+            pattern=\"[a-z0-9](?:[-a-z0-9]*[a-z0-9])?\"\n+            required\n+          />\n+        </div>\n+        <p className=\"form-text text-muted\" id=\"pvc-name-help\">\n+          A unique name for the storage claim within the project.\n+        </p>\n+        <label className=\"control-label co-required\" htmlFor=\"access-mode\">\n+          Access Mode\n+        </label>\n+        <div className=\"form-group\">\n+          {this.state.radios.map(radio => {\n+            const checked = radio.value === this.state.accessMode;\n+            return (\n+              <RadioInput\n+                {...radio}\n+                key={radio.value}\n+                onChange={this.handleChange}\n+                checked={checked}\n+                aria-describedby=\"access-mode-help\"\n+                className=\"radio-inline\"\n+                name=\"accessMode\"\n+              />\n+            );\n+          })}\n+          <p className=\"form-text text-muted\" id=\"access-mode-help\">\n+            Permissions to the mounted drive.\n+          </p>\n+        </div>\n+        <label className=\"control-label co-required\" htmlFor=\"request-size-input\">\n+          Size\n+        </label>\n+        <RequestSizeInput\n+          name=\"requestSize\"\n+          required={false}\n+          onChange={this.handleChange}\n+          placeholder={requestSizeValue}\n+          defaultRequestSizeUnit={requestSizeUnit}\n+          dropdownUnits={dropdownUnits}\n+          describedBy=\"request-size-help\"\n+        />\n+        <p className=\"form-text text-muted\" id=\"requestSize-help\">\n+          Desired storage capacity.\n+        </p>\n+        <Checkbox\n+          label=\"Use label selectors to request storage\"\n+          onChange={this.toggleShowLabelSelectors}\n+          checked={showLabelSelectors}\n+          name=\"showLabelSelector\"\n+        />\n+        <div className=\"form-group\">\n+          {showLabelSelectors && (\n+            <NameValueEditor\n+              nameValuePairs={nameValuePairs}\n+              valueString=\"Selector\"\n+              nameString=\"Label\"\n+              addString=\"Add Value\"\n+              readOnly={false}\n+              allowSorting={false}\n+              updateParentData={this.handleNameValuePairs}\n+            />\n+          )}\n+          <p className=\"form-text text-muted\" id=\"label-selector-help\">\n+            Use label selectors to define how storage is created.\n+          </p>\n+        </div>\n+      </div>\n+\n+    );\n+  }\n+}\n+\n+class CreatePvcPage extends React.Component<CreatePvcPageProps, CreatePvcPageState> {\n+  constructor(props) {\n+    super(props);\n+\n+    this.state = {\n+      error: '',\n+      inProgress: false,\n+      title: 'Create Storage',\n+      pvcObj: {},\n+    };\n+  }\n+\n+  onChange = pvcObj => {\n+    this.setState({ pvcObj });\n+  };\n+\n+  validateForm = () => {\n+    if (!_.get(this.state.pvcObj, 'metadata.name')) {\n+      this.setState({ error: 'Persistent volume claim name must be set.' });\n+      return false;\n+    }\n+    return true;\n+  };\n+\n+  save = e => {\n+    if (!this.validateForm()) {\n+      return;\n+    }\n+    e.preventDefault();\n+    this.setState({ inProgress: true });\n+    k8sCreate(this.props.kindObj, this.state.pvcObj).then(\n+      resource => {\n+        this.setState({ inProgress: false });\n+        history.push(resourceObjPath(resource, referenceFor(resource)));\n+      },\n+      err => this.setState({ error: err.message, inProgress: false })\n+    );\n+  };\n+\n+  render() {\n+    const { title, error, inProgress } = this.state;\n+    const { namespace, kindObj } = this.props;\n+    return (\n+      <div className=\"co-m-pane__body\">\n+        <Helmet>\n+          <title>{title}</title>\n+        </Helmet>\n+        <h1 className=\"co-m-pane__heading\">{title}</h1>\n+        <form className=\"co-m-pane__body-group \" onSubmit={this.save}>\n+          <CreatePvcForm onChange={this.onChange} isCreate={true} namespace={namespace} kindObj={kindObj} />\n+          <ButtonBar errorMessage={error} inProgress={inProgress}>\n+            <button type=\"submit\" className=\"btn btn-primary\" id=\"save-changes\">\n+              Create\n+            </button>\n+            <button type=\"button\" className=\"btn btn-default\" onClick={history.goBack}>\n+              Cancel\n+            </button>\n+          </ButtonBar>\n+        </form>\n+      </div>\n+    );\n+  }\n+}\n+\n+export const CreatePvc_ = ({ kindObj, kindsInFlight, match: { params } }) => {\n+  if (!kindObj && kindsInFlight) {\n+    return <LoadingBox />;\n+  }\n+  return <CreatePvcPage isCreate={true} namespace={params.ns} kindObj={kindObj} />;\n+};\n+\n+export const CreatePvc = connectToPlural(CreatePvc_);\n+\n+export type StorageClassDropdownProps = {\n+  namespace: string;\n+  selectedKey: string;\n+  required: boolean;\n+  onChange: Function;\n+  id: string;\n+  name: string;\n+  placeholder?: string;\n+};\n+\n+export type CreatePvcFormProps = {\n+  kindObj: K8sKind;\n+  isCreate: boolean;","path":"frontend/public/components/storage/create-pvc.tsx","position":335,"original_position":335,"commit_id":"7437d830cfafa0f12c7720ba534bbc745f957022","original_commit_id":"7437d830cfafa0f12c7720ba534bbc745f957022","user":{"login":"spadgett","id":1167259,"node_id":"MDQ6VXNlcjExNjcyNTk=","avatar_url":"https://avatars1.githubusercontent.com/u/1167259?v=4","gravatar_id":"","url":"https://api.github.com/users/spadgett","html_url":"https://github.com/spadgett","followers_url":"https://api.github.com/users/spadgett/followers","following_url":"https://api.github.com/users/spadgett/following{/other_user}","gists_url":"https://api.github.com/users/spadgett/gists{/gist_id}","starred_url":"https://api.github.com/users/spadgett/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spadgett/subscriptions","organizations_url":"https://api.github.com/users/spadgett/orgs","repos_url":"https://api.github.com/users/spadgett/repos","events_url":"https://api.github.com/users/spadgett/events{/privacy}","received_events_url":"https://api.github.com/users/spadgett/received_events","type":"User","site_admin":false},"body":"Remove this prop since we're always creating. We can add it back if/when we add an edit PVC action","created_at":"2018-10-30T16:26:10Z","updated_at":"2018-10-30T16:43:23Z","html_url":"https://github.com/openshift/console/pull/654#discussion_r229381002","pull_request_url":"https://api.github.com/repos/openshift/console/pulls/654","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/openshift/console/pulls/comments/229381002"},"html":{"href":"https://github.com/openshift/console/pull/654#discussion_r229381002"},"pull_request":{"href":"https://api.github.com/repos/openshift/console/pulls/654"}}},"pull_request":{"url":"https://api.github.com/repos/openshift/console/pulls/654","id":222934144,"node_id":"MDExOlB1bGxSZXF1ZXN0MjIyOTM0MTQ0","html_url":"https://github.com/openshift/console/pull/654","diff_url":"https://github.com/openshift/console/pull/654.diff","patch_url":"https://github.com/openshift/console/pull/654.patch","issue_url":"https://api.github.com/repos/openshift/console/issues/654","number":654,"state":"open","locked":false,"title":"Create PVC Form - Add form to Attach Storage","user":{"login":"zherman0","id":18728857,"node_id":"MDQ6VXNlcjE4NzI4ODU3","avatar_url":"https://avatars0.githubusercontent.com/u/18728857?v=4","gravatar_id":"","url":"https://api.github.com/users/zherman0","html_url":"https://github.com/zherman0","followers_url":"https://api.github.com/users/zherman0/followers","following_url":"https://api.github.com/users/zherman0/following{/other_user}","gists_url":"https://api.github.com/users/zherman0/gists{/gist_id}","starred_url":"https://api.github.com/users/zherman0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zherman0/subscriptions","organizations_url":"https://api.github.com/users/zherman0/orgs","repos_url":"https://api.github.com/users/zherman0/repos","events_url":"https://api.github.com/users/zherman0/events{/privacy}","received_events_url":"https://api.github.com/users/zherman0/received_events","type":"User","site_admin":false},"body":"This is part 2 and now part 3 for the attach storage overall project.  This specifically creates a form component that will allow users to create a new persistent volume claim.  Although this form will exist within the attach storage form, it still makes sense to give this a page of its own from the pvc section of the console.  The attach storage screen now also contains the create pvc form. See images below.\r\n\r\n![create-pvc-create-dropdown](https://user-images.githubusercontent.com/18728857/47051928-96657880-d163-11e8-93a6-fe646c89e350.png)\r\n![create-pvc1](https://user-images.githubusercontent.com/18728857/47051932-9a919600-d163-11e8-8aa7-ca3f231ce54e.png)\r\n![clear-selection](https://user-images.githubusercontent.com/18728857/47611656-52aa2300-da2f-11e8-96a7-dcaecd7e737d.png)\r\n![create-pvc-with-clear-selection-and-dropdown](https://user-images.githubusercontent.com/18728857/47611689-c815f380-da2f-11e8-8039-0bbb0fc3bd0b.png)\r\n\r\n![create-pvc-sc-dropdown](https://user-images.githubusercontent.com/18728857/47051936-9ebdb380-d163-11e8-9de4-cd1e202add93.png)\r\n![create-pvc-labels](https://user-images.githubusercontent.com/18728857/47051940-a4b39480-d163-11e8-9321-dc689a6a5b66.png)\r\n\r\nThese are the images for attach storage with the create pvc form.\r\n![attach-storage-with-pvc1](https://user-images.githubusercontent.com/18728857/47611654-43c37080-da2f-11e8-996c-c239d9a38402.png)\r\n![attach-storage-with-pvc-active](https://user-images.githubusercontent.com/18728857/47611655-4920bb00-da2f-11e8-877e-447b956d3a56.png)\r\n","created_at":"2018-10-15T14:48:53Z","updated_at":"2018-10-30T16:43:22Z","closed_at":null,"merged_at":null,"merge_commit_sha":"953a8e400ad595bac3b8960fb4021f50fb5c431c","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":926925141,"node_id":"MDU6TGFiZWw5MjY5MjUxNDE=","url":"https://api.github.com/repos/openshift/console/labels/size/XL","name":"size/XL","color":"ee5500","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/openshift/console/pulls/654/commits","review_comments_url":"https://api.github.com/repos/openshift/console/pulls/654/comments","review_comment_url":"https://api.github.com/repos/openshift/console/pulls/comments{/number}","comments_url":"https://api.github.com/repos/openshift/console/issues/654/comments","statuses_url":"https://api.github.com/repos/openshift/console/statuses/7437d830cfafa0f12c7720ba534bbc745f957022","head":{"label":"zherman0:createpvc","ref":"createpvc","sha":"7437d830cfafa0f12c7720ba534bbc745f957022","user":{"login":"zherman0","id":18728857,"node_id":"MDQ6VXNlcjE4NzI4ODU3","avatar_url":"https://avatars0.githubusercontent.com/u/18728857?v=4","gravatar_id":"","url":"https://api.github.com/users/zherman0","html_url":"https://github.com/zherman0","followers_url":"https://api.github.com/users/zherman0/followers","following_url":"https://api.github.com/users/zherman0/following{/other_user}","gists_url":"https://api.github.com/users/zherman0/gists{/gist_id}","starred_url":"https://api.github.com/users/zherman0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zherman0/subscriptions","organizations_url":"https://api.github.com/users/zherman0/orgs","repos_url":"https://api.github.com/users/zherman0/repos","events_url":"https://api.github.com/users/zherman0/events{/privacy}","received_events_url":"https://api.github.com/users/zherman0/received_events","type":"User","site_admin":false},"repo":{"id":140342837,"node_id":"MDEwOlJlcG9zaXRvcnkxNDAzNDI4Mzc=","name":"console","full_name":"zherman0/console","private":false,"owner":{"login":"zherman0","id":18728857,"node_id":"MDQ6VXNlcjE4NzI4ODU3","avatar_url":"https://avatars0.githubusercontent.com/u/18728857?v=4","gravatar_id":"","url":"https://api.github.com/users/zherman0","html_url":"https://github.com/zherman0","followers_url":"https://api.github.com/users/zherman0/followers","following_url":"https://api.github.com/users/zherman0/following{/other_user}","gists_url":"https://api.github.com/users/zherman0/gists{/gist_id}","starred_url":"https://api.github.com/users/zherman0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zherman0/subscriptions","organizations_url":"https://api.github.com/users/zherman0/orgs","repos_url":"https://api.github.com/users/zherman0/repos","events_url":"https://api.github.com/users/zherman0/events{/privacy}","received_events_url":"https://api.github.com/users/zherman0/received_events","type":"User","site_admin":false},"html_url":"https://github.com/zherman0/console","description":"OpenShift Cluster Console UI","fork":true,"url":"https://api.github.com/repos/zherman0/console","forks_url":"https://api.github.com/repos/zherman0/console/forks","keys_url":"https://api.github.com/repos/zherman0/console/keys{/key_id}","collaborators_url":"https://api.github.com/repos/zherman0/console/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/zherman0/console/teams","hooks_url":"https://api.github.com/repos/zherman0/console/hooks","issue_events_url":"https://api.github.com/repos/zherman0/console/issues/events{/number}","events_url":"https://api.github.com/repos/zherman0/console/events","assignees_url":"https://api.github.com/repos/zherman0/console/assignees{/user}","branches_url":"https://api.github.com/repos/zherman0/console/branches{/branch}","tags_url":"https://api.github.com/repos/zherman0/console/tags","blobs_url":"https://api.github.com/repos/zherman0/console/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/zherman0/console/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/zherman0/console/git/refs{/sha}","trees_url":"https://api.github.com/repos/zherman0/console/git/trees{/sha}","statuses_url":"https://api.github.com/repos/zherman0/console/statuses/{sha}","languages_url":"https://api.github.com/repos/zherman0/console/languages","stargazers_url":"https://api.github.com/repos/zherman0/console/stargazers","contributors_url":"https://api.github.com/repos/zherman0/console/contributors","subscribers_url":"https://api.github.com/repos/zherman0/console/subscribers","subscription_url":"https://api.github.com/repos/zherman0/console/subscription","commits_url":"https://api.github.com/repos/zherman0/console/commits{/sha}","git_commits_url":"https://api.github.com/repos/zherman0/console/git/commits{/sha}","comments_url":"https://api.github.com/repos/zherman0/console/comments{/number}","issue_comment_url":"https://api.github.com/repos/zherman0/console/issues/comments{/number}","contents_url":"https://api.github.com/repos/zherman0/console/contents/{+path}","compare_url":"https://api.github.com/repos/zherman0/console/compare/{base}...{head}","merges_url":"https://api.github.com/repos/zherman0/console/merges","archive_url":"https://api.github.com/repos/zherman0/console/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/zherman0/console/downloads","issues_url":"https://api.github.com/repos/zherman0/console/issues{/number}","pulls_url":"https://api.github.com/repos/zherman0/console/pulls{/number}","milestones_url":"https://api.github.com/repos/zherman0/console/milestones{/number}","notifications_url":"https://api.github.com/repos/zherman0/console/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/zherman0/console/labels{/name}","releases_url":"https://api.github.com/repos/zherman0/console/releases{/id}","deployments_url":"https://api.github.com/repos/zherman0/console/deployments","created_at":"2018-07-09T21:14:08Z","updated_at":"2018-10-22T15:18:03Z","pushed_at":"2018-10-29T15:30:04Z","git_url":"git://github.com/zherman0/console.git","ssh_url":"git@github.com:zherman0/console.git","clone_url":"https://github.com/zherman0/console.git","svn_url":"https://github.com/zherman0/console","homepage":"https://www.openshift.org","size":88584,"stargazers_count":0,"watchers_count":0,"language":"TypeScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"openshift:master","ref":"master","sha":"1745cd8f78df932c07ca5622f8287ed4f44135b2","user":{"login":"openshift","id":792337,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc5MjMzNw==","avatar_url":"https://avatars3.githubusercontent.com/u/792337?v=4","gravatar_id":"","url":"https://api.github.com/users/openshift","html_url":"https://github.com/openshift","followers_url":"https://api.github.com/users/openshift/followers","following_url":"https://api.github.com/users/openshift/following{/other_user}","gists_url":"https://api.github.com/users/openshift/gists{/gist_id}","starred_url":"https://api.github.com/users/openshift/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openshift/subscriptions","organizations_url":"https://api.github.com/users/openshift/orgs","repos_url":"https://api.github.com/users/openshift/repos","events_url":"https://api.github.com/users/openshift/events{/privacy}","received_events_url":"https://api.github.com/users/openshift/received_events","type":"Organization","site_admin":false},"repo":{"id":129436456,"node_id":"MDEwOlJlcG9zaXRvcnkxMjk0MzY0NTY=","name":"console","full_name":"openshift/console","private":false,"owner":{"login":"openshift","id":792337,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc5MjMzNw==","avatar_url":"https://avatars3.githubusercontent.com/u/792337?v=4","gravatar_id":"","url":"https://api.github.com/users/openshift","html_url":"https://github.com/openshift","followers_url":"https://api.github.com/users/openshift/followers","following_url":"https://api.github.com/users/openshift/following{/other_user}","gists_url":"https://api.github.com/users/openshift/gists{/gist_id}","starred_url":"https://api.github.com/users/openshift/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openshift/subscriptions","organizations_url":"https://api.github.com/users/openshift/orgs","repos_url":"https://api.github.com/users/openshift/repos","events_url":"https://api.github.com/users/openshift/events{/privacy}","received_events_url":"https://api.github.com/users/openshift/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/openshift/console","description":"OpenShift Cluster Console UI","fork":false,"url":"https://api.github.com/repos/openshift/console","forks_url":"https://api.github.com/repos/openshift/console/forks","keys_url":"https://api.github.com/repos/openshift/console/keys{/key_id}","collaborators_url":"https://api.github.com/repos/openshift/console/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/openshift/console/teams","hooks_url":"https://api.github.com/repos/openshift/console/hooks","issue_events_url":"https://api.github.com/repos/openshift/console/issues/events{/number}","events_url":"https://api.github.com/repos/openshift/console/events","assignees_url":"https://api.github.com/repos/openshift/console/assignees{/user}","branches_url":"https://api.github.com/repos/openshift/console/branches{/branch}","tags_url":"https://api.github.com/repos/openshift/console/tags","blobs_url":"https://api.github.com/repos/openshift/console/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/openshift/console/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/openshift/console/git/refs{/sha}","trees_url":"https://api.github.com/repos/openshift/console/git/trees{/sha}","statuses_url":"https://api.github.com/repos/openshift/console/statuses/{sha}","languages_url":"https://api.github.com/repos/openshift/console/languages","stargazers_url":"https://api.github.com/repos/openshift/console/stargazers","contributors_url":"https://api.github.com/repos/openshift/console/contributors","subscribers_url":"https://api.github.com/repos/openshift/console/subscribers","subscription_url":"https://api.github.com/repos/openshift/console/subscription","commits_url":"https://api.github.com/repos/openshift/console/commits{/sha}","git_commits_url":"https://api.github.com/repos/openshift/console/git/commits{/sha}","comments_url":"https://api.github.com/repos/openshift/console/comments{/number}","issue_comment_url":"https://api.github.com/repos/openshift/console/issues/comments{/number}","contents_url":"https://api.github.com/repos/openshift/console/contents/{+path}","compare_url":"https://api.github.com/repos/openshift/console/compare/{base}...{head}","merges_url":"https://api.github.com/repos/openshift/console/merges","archive_url":"https://api.github.com/repos/openshift/console/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/openshift/console/downloads","issues_url":"https://api.github.com/repos/openshift/console/issues{/number}","pulls_url":"https://api.github.com/repos/openshift/console/pulls{/number}","milestones_url":"https://api.github.com/repos/openshift/console/milestones{/number}","notifications_url":"https://api.github.com/repos/openshift/console/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/openshift/console/labels{/name}","releases_url":"https://api.github.com/repos/openshift/console/releases{/id}","deployments_url":"https://api.github.com/repos/openshift/console/deployments","created_at":"2018-04-13T17:54:59Z","updated_at":"2018-10-30T13:45:15Z","pushed_at":"2018-10-30T16:26:13Z","git_url":"git://github.com/openshift/console.git","ssh_url":"git@github.com:openshift/console.git","clone_url":"https://github.com/openshift/console.git","svn_url":"https://github.com/openshift/console","homepage":"https://www.openshift.org","size":88752,"stargazers_count":30,"watchers_count":30,"language":"TypeScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":44,"mirror_url":null,"archived":false,"open_issues_count":35,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":44,"open_issues":35,"watchers":30,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/openshift/console/pulls/654"},"html":{"href":"https://github.com/openshift/console/pull/654"},"issue":{"href":"https://api.github.com/repos/openshift/console/issues/654"},"comments":{"href":"https://api.github.com/repos/openshift/console/issues/654/comments"},"review_comments":{"href":"https://api.github.com/repos/openshift/console/pulls/654/comments"},"review_comment":{"href":"https://api.github.com/repos/openshift/console/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/openshift/console/pulls/654/commits"},"statuses":{"href":"https://api.github.com/repos/openshift/console/statuses/7437d830cfafa0f12c7720ba534bbc745f957022"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"spadgett"}}