{"action":"created","comment":{"url":"https://api.github.com/repos/libopenstorage/openstorage/pulls/comments/207386991","pull_request_review_id":142984310,"id":207386991,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwNzM4Njk5MQ==","diff_hunk":"@@ -0,0 +1,376 @@\n+package vsphere\n+\n+import (\n+\t\"context\"\n+\t\"fmt\"\n+\t\"path\"\n+\t\"path/filepath\"\n+\t\"strings\"\n+\n+\t\"github.com/kubernetes/kubernetes/pkg/cloudprovider/providers/vsphere/vclib/diskmanagers\"\n+\t\"github.com/libopenstorage/openstorage/pkg/storageops\"\n+\t\"github.com/sirupsen/logrus\"\n+\t\"github.com/vmware/govmomi/vim25/types\"\n+\t\"k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere/vclib\"\n+)\n+\n+const (\n+\tdiskDirectory  = \"osd-provisioned-disks\"\n+\tdummyDiskName  = \"kube-dummyDisk.vmdk\"\n+\tdiskByIDPath   = \"/dev/disk/by-id/\"\n+\tdiskSCSIPrefix = \"wwn-0x\"\n+)\n+\n+type vsphereOps struct {\n+\tvm   *vclib.VirtualMachine\n+\tconn *vclib.VSphereConnection\n+\tcfg  *VSphereConfig\n+}\n+\n+// NewClient creates a new vsphere storageops instance\n+func NewClient(cfg *VSphereConfig) (storageops.Ops, error) {\n+\tvSphereConn := &vclib.VSphereConnection{\n+\t\tUsername:          cfg.User,\n+\t\tPassword:          cfg.Password,\n+\t\tHostname:          cfg.VCenterIP,\n+\t\tInsecure:          cfg.InsecureFlag,\n+\t\tRoundTripperCount: cfg.RoundTripperCount,\n+\t\tPort:              cfg.VCenterPort,\n+\t}\n+\n+\tctx, cancel := context.WithCancel(context.Background())\n+\tdefer cancel()\n+\tvmObj, err := GetVMObject(ctx, vSphereConn, cfg.VMUUID)\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\n+\tlogrus.Infof(\"Using following configuration for vsphere:\")\n+\tlogrus.Infof(\"  vCenter: %s:%s\", cfg.VCenterIP, cfg.VCenterPort)\n+\tlogrus.Infof(\"  Datacenter: %s\", vmObj.Datacenter.Name())\n+\tlogrus.Infof(\"  VMUUID: %s\", cfg.VMUUID)\n+\n+\treturn &vsphereOps{\n+\t\tcfg:  cfg,\n+\t\tvm:   vmObj,\n+\t\tconn: vSphereConn,\n+\t}, nil\n+}\n+\n+// Name returns name of the storage operations driver\n+func (ops *vsphereOps) Name() string {\n+\treturn \"vsphere\"\n+}\n+\n+func (ops *vsphereOps) Create(opts interface{}, labels map[string]string) (interface{}, error) {\n+\tvolumeOptions, ok := opts.(*vclib.VolumeOptions)\n+\tif !ok {\n+\t\treturn nil, fmt.Errorf(\"invalid volume options specified to create: %v\", opts)\n+\t}\n+\n+\tif len(volumeOptions.Tags) == 0 {\n+\t\tvolumeOptions.Tags = labels\n+\t} else {\n+\t\tfor k, v := range labels {\n+\t\t\tvolumeOptions.Tags[k] = v\n+\t\t}\n+\t}\n+\n+\tif len(volumeOptions.Datastore) == 0 {\n+\t\treturn nil, fmt.Errorf(\"datastore is required for the create call\")\n+\t}\n+\n+\tdatastore := strings.TrimSpace(volumeOptions.Datastore)\n+\tlogrus.Infof(\"Using datastore: %s for new disk\", datastore)\n+\n+\tctx, cancel := context.WithCancel(context.Background())\n+\tdefer cancel()\n+\n+\tvmObj, err := ops.renewVM(ctx, ops.vm)\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\n+\tds, err := vmObj.Datacenter.GetDatastoreByName(ctx, datastore)\n+\tif err != nil {\n+\t\tlogrus.Errorf(\"Failed to get datastore: %s due to: %v\", datastore, err)\n+\t\treturn nil, err\n+\t}\n+\n+\tvolumeOptions.Datastore = datastore\n+\n+\tdiskBasePath := filepath.Clean(ds.Path(diskDirectory)) + \"/\"\n+\terr = ds.CreateDirectory(ctx, diskBasePath, false)\n+\tif err != nil && err != vclib.ErrFileAlreadyExist {\n+\t\tlogrus.Errorf(\"Cannot create dir %#v. err %s\", diskBasePath, err)\n+\t\treturn nil, err\n+\t}\n+\n+\tdiskPath := diskBasePath + volumeOptions.Name + \".vmdk\"\n+\tdisk := diskmanagers.VirtualDisk{\n+\t\tDiskPath:      diskPath,\n+\t\tVolumeOptions: volumeOptions,\n+\t}\n+\n+\tdiskPath, err = disk.Create(ctx, ds)\n+\tif err != nil {\n+\t\tlogrus.Errorf(\"Failed to create a vsphere volume with volumeOptions: %+v on \"+\n+\t\t\t\"datastore: %s. err: %+v\", volumeOptions, datastore, err)\n+\t\treturn nil, err\n+\t}\n+\n+\t// Get the canonical path for the volume path.\n+\tcanonicalVolumePath, err := getCanonicalVolumePath(ctx, vmObj.Datacenter, diskPath)\n+\tif err != nil {\n+\t\tlogrus.Errorf(\"Failed to get canonical vsphere disk path for: %s with \"+\n+\t\t\t\"volumeOptions: %+v on datastore: %s. err: %+v\", diskPath, volumeOptions, datastore, err)\n+\t\treturn nil, err\n+\t}\n+\n+\treturn canonicalVolumePath, nil\n+\n+}\n+\n+func (ops *vsphereOps) GetDeviceID(diskPath interface{}) (string, error) {\n+\tid, ok := diskPath.(string)\n+\tif !ok {\n+\t\treturn \"\", fmt.Errorf(\"invalid input: %v to GetDeviceID\", diskPath)\n+\t}\n+\n+\treturn id, nil\n+}\n+\n+// Attach takes in the path of the vmdk file and returns where it is attached inside the vm instance\n+func (ops *vsphereOps) Attach(diskPath string) (string, error) {\n+\tctx, cancel := context.WithCancel(context.Background())\n+\tdefer cancel()\n+\n+\tvmObj, err := ops.renewVM(ctx, ops.vm)\n+\tif err != nil {\n+\t\treturn \"\", err\n+\t}\n+\n+\tdiskUUID, err := vmObj.AttachDisk(ctx, diskPath, &vclib.VolumeOptions{SCSIControllerType: vclib.PVSCSIControllerType})\n+\tif err != nil {\n+\t\tlogrus.Errorf(\"Failed to attach vsphere disk: %s for VM: %s. err: +%v\", diskPath, vmObj.Name(), err)\n+\t\treturn \"\", err\n+\t}\n+\n+\treturn path.Join(diskByIDPath, diskSCSIPrefix+diskUUID), nil\n+}\n+\n+func (ops *vsphereOps) Detach(diskPath string) error {\n+\tctx, cancel := context.WithCancel(context.Background())\n+\tdefer cancel()\n+\n+\tvmObj, err := ops.renewVM(ctx, ops.vm)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\tif err := vmObj.DetachDisk(ctx, diskPath); err != nil {\n+\t\tlogrus.Errorf(\"Failed to detach vsphere disk: %s for VM: %s. err: +%v\", diskPath, vmObj.Name(), err)\n+\t\treturn err\n+\t}\n+\n+\treturn nil\n+}\n+\n+// Delete virtual disk at given path\n+func (ops *vsphereOps) Delete(diskPath string) error {\n+\tctx, cancel := context.WithCancel(context.Background())\n+\tdefer cancel()\n+\n+\tvmObj, err := ops.renewVM(ctx, ops.vm)\n+\tif err != nil {\n+\t\treturn err\n+\t}\n+\n+\tdisk := diskmanagers.VirtualDisk{\n+\t\tDiskPath:      diskPath,\n+\t\tVolumeOptions: &vclib.VolumeOptions{},\n+\t\tVMOptions:     &vclib.VMOptions{},\n+\t}\n+\n+\terr = disk.Delete(ctx, vmObj.Datacenter)\n+\tif err != nil {\n+\t\tlogrus.Errorf(\"Failed to delete vsphere disk: %s. err: %+v\", diskPath, err)\n+\t}\n+\n+\treturn err\n+}\n+\n+// Desribe an instance of the virtual machine object to which ops is connected to\n+func (ops *vsphereOps) Describe() (interface{}, error) {\n+\tctx, cancel := context.WithCancel(context.Background())\n+\tdefer cancel()\n+\n+\treturn ops.renewVM(ctx, ops.vm)\n+}\n+\n+// FreeDevices is not supported by this provider\n+func (ops *vsphereOps) FreeDevices(blockDeviceMappings []interface{}, rootDeviceName string) ([]string, error) {\n+\treturn nil, storageops.ErrNotSupported\n+}\n+\n+func (ops *vsphereOps) Inspect(diskPaths []*string) ([]interface{}, error) {\n+\t// TODO find a way to map diskPaths to unattached/attached virtual disks and query info\n+\t// currently returning the disks directly\n+\n+\treturn nil, storageops.ErrNotSupported\n+}\n+\n+// DeviceMappings returns map[local_attached_volume_path]->volume ID/NAME\n+func (ops *vsphereOps) DeviceMappings() (map[string]string, error) {\n+\tctx, cancel := context.WithCancel(context.Background())\n+\tdefer cancel()\n+\n+\tvmObj, err := ops.renewVM(ctx, ops.vm)\n+\tif err != nil {\n+\t\treturn nil, err\n+\t}\n+\n+\tvmDevices, err := vmObj.Device(ctx)\n+\tif err != nil {\n+\t\treturn nil, fmt.Errorf(\"failed to get devices for vm: %s\", vmObj.Name())\n+\t}\n+\n+\t// Go over all the devices attached on this vm and create a map of just the virtual disks and where\n+\t// they are attached on the vm\n+\tm := make(map[string]string)\n+\tfor _, device := range vmDevices {\n+\t\tif vmDevices.TypeName(device) == \"VirtualDisk\" {\n+\t\t\tvirtualDevice := device.GetVirtualDevice()\n+\t\t\tbacking, ok := virtualDevice.Backing.(*types.VirtualDiskFlatVer2BackingInfo)\n+\t\t\tif ok {\n+\t\t\t\tdevicePath, err := ops.DevicePath(backing.FileName)\n+\t\t\t\tif err == nil && len(devicePath) != 0 { // TODO can ignore errors?","path":"pkg/storageops/vsphere/vsphere.go","position":247,"original_position":247,"commit_id":"963c270341c02e7604aee9c3913b93038227b10f","original_commit_id":"963c270341c02e7604aee9c3913b93038227b10f","user":{"login":"adityadani","id":313611,"node_id":"MDQ6VXNlcjMxMzYxMQ==","avatar_url":"https://avatars3.githubusercontent.com/u/313611?v=4","gravatar_id":"","url":"https://api.github.com/users/adityadani","html_url":"https://github.com/adityadani","followers_url":"https://api.github.com/users/adityadani/followers","following_url":"https://api.github.com/users/adityadani/following{/other_user}","gists_url":"https://api.github.com/users/adityadani/gists{/gist_id}","starred_url":"https://api.github.com/users/adityadani/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adityadani/subscriptions","organizations_url":"https://api.github.com/users/adityadani/orgs","repos_url":"https://api.github.com/users/adityadani/repos","events_url":"https://api.github.com/users/adityadani/events{/privacy}","received_events_url":"https://api.github.com/users/adityadani/received_events","type":"User","site_admin":false},"body":"nit: we are calling renewVM twice, once in this function and once in DevicePath.","created_at":"2018-08-02T21:54:47Z","updated_at":"2018-08-02T21:55:21Z","html_url":"https://github.com/libopenstorage/openstorage/pull/442#discussion_r207386991","pull_request_url":"https://api.github.com/repos/libopenstorage/openstorage/pulls/442","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/libopenstorage/openstorage/pulls/comments/207386991"},"html":{"href":"https://github.com/libopenstorage/openstorage/pull/442#discussion_r207386991"},"pull_request":{"href":"https://api.github.com/repos/libopenstorage/openstorage/pulls/442"}}},"pull_request":{"url":"https://api.github.com/repos/libopenstorage/openstorage/pulls/442","id":190132761,"node_id":"MDExOlB1bGxSZXF1ZXN0MTkwMTMyNzYx","html_url":"https://github.com/libopenstorage/openstorage/pull/442","diff_url":"https://github.com/libopenstorage/openstorage/pull/442.diff","patch_url":"https://github.com/libopenstorage/openstorage/pull/442.patch","issue_url":"https://api.github.com/repos/libopenstorage/openstorage/issues/442","number":442,"state":"open","locked":false,"title":" Add vsphere storage ops implementation","user":{"login":"harsh-px","id":26801153,"node_id":"MDQ6VXNlcjI2ODAxMTUz","avatar_url":"https://avatars1.githubusercontent.com/u/26801153?v=4","gravatar_id":"","url":"https://api.github.com/users/harsh-px","html_url":"https://github.com/harsh-px","followers_url":"https://api.github.com/users/harsh-px/followers","following_url":"https://api.github.com/users/harsh-px/following{/other_user}","gists_url":"https://api.github.com/users/harsh-px/gists{/gist_id}","starred_url":"https://api.github.com/users/harsh-px/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/harsh-px/subscriptions","organizations_url":"https://api.github.com/users/harsh-px/orgs","repos_url":"https://api.github.com/users/harsh-px/repos","events_url":"https://api.github.com/users/harsh-px/events{/privacy}","received_events_url":"https://api.github.com/users/harsh-px/received_events","type":"User","site_admin":false},"body":"\r\n","created_at":"2018-05-23T23:33:03Z","updated_at":"2018-08-02T21:55:21Z","closed_at":null,"merged_at":null,"merge_commit_sha":"54b0f3276224287ed8b19c4280adf5a30c8e55eb","assignee":{"login":"harsh-px","id":26801153,"node_id":"MDQ6VXNlcjI2ODAxMTUz","avatar_url":"https://avatars1.githubusercontent.com/u/26801153?v=4","gravatar_id":"","url":"https://api.github.com/users/harsh-px","html_url":"https://github.com/harsh-px","followers_url":"https://api.github.com/users/harsh-px/followers","following_url":"https://api.github.com/users/harsh-px/following{/other_user}","gists_url":"https://api.github.com/users/harsh-px/gists{/gist_id}","starred_url":"https://api.github.com/users/harsh-px/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/harsh-px/subscriptions","organizations_url":"https://api.github.com/users/harsh-px/orgs","repos_url":"https://api.github.com/users/harsh-px/repos","events_url":"https://api.github.com/users/harsh-px/events{/privacy}","received_events_url":"https://api.github.com/users/harsh-px/received_events","type":"User","site_admin":false},"assignees":[{"login":"harsh-px","id":26801153,"node_id":"MDQ6VXNlcjI2ODAxMTUz","avatar_url":"https://avatars1.githubusercontent.com/u/26801153?v=4","gravatar_id":"","url":"https://api.github.com/users/harsh-px","html_url":"https://github.com/harsh-px","followers_url":"https://api.github.com/users/harsh-px/followers","following_url":"https://api.github.com/users/harsh-px/following{/other_user}","gists_url":"https://api.github.com/users/harsh-px/gists{/gist_id}","starred_url":"https://api.github.com/users/harsh-px/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/harsh-px/subscriptions","organizations_url":"https://api.github.com/users/harsh-px/orgs","repos_url":"https://api.github.com/users/harsh-px/repos","events_url":"https://api.github.com/users/harsh-px/events{/privacy}","received_events_url":"https://api.github.com/users/harsh-px/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"piyush-nimbalkar","id":313758,"node_id":"MDQ6VXNlcjMxMzc1OA==","avatar_url":"https://avatars0.githubusercontent.com/u/313758?v=4","gravatar_id":"","url":"https://api.github.com/users/piyush-nimbalkar","html_url":"https://github.com/piyush-nimbalkar","followers_url":"https://api.github.com/users/piyush-nimbalkar/followers","following_url":"https://api.github.com/users/piyush-nimbalkar/following{/other_user}","gists_url":"https://api.github.com/users/piyush-nimbalkar/gists{/gist_id}","starred_url":"https://api.github.com/users/piyush-nimbalkar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/piyush-nimbalkar/subscriptions","organizations_url":"https://api.github.com/users/piyush-nimbalkar/orgs","repos_url":"https://api.github.com/users/piyush-nimbalkar/repos","events_url":"https://api.github.com/users/piyush-nimbalkar/events{/privacy}","received_events_url":"https://api.github.com/users/piyush-nimbalkar/received_events","type":"User","site_admin":false},{"login":"jvinod","id":10396455,"node_id":"MDQ6VXNlcjEwMzk2NDU1","avatar_url":"https://avatars0.githubusercontent.com/u/10396455?v=4","gravatar_id":"","url":"https://api.github.com/users/jvinod","html_url":"https://github.com/jvinod","followers_url":"https://api.github.com/users/jvinod/followers","following_url":"https://api.github.com/users/jvinod/following{/other_user}","gists_url":"https://api.github.com/users/jvinod/gists{/gist_id}","starred_url":"https://api.github.com/users/jvinod/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jvinod/subscriptions","organizations_url":"https://api.github.com/users/jvinod/orgs","repos_url":"https://api.github.com/users/jvinod/repos","events_url":"https://api.github.com/users/jvinod/events{/privacy}","received_events_url":"https://api.github.com/users/jvinod/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/libopenstorage/openstorage/pulls/442/commits","review_comments_url":"https://api.github.com/repos/libopenstorage/openstorage/pulls/442/comments","review_comment_url":"https://api.github.com/repos/libopenstorage/openstorage/pulls/comments{/number}","comments_url":"https://api.github.com/repos/libopenstorage/openstorage/issues/442/comments","statuses_url":"https://api.github.com/repos/libopenstorage/openstorage/statuses/963c270341c02e7604aee9c3913b93038227b10f","head":{"label":"harsh-px:vsphere","ref":"vsphere","sha":"963c270341c02e7604aee9c3913b93038227b10f","user":{"login":"harsh-px","id":26801153,"node_id":"MDQ6VXNlcjI2ODAxMTUz","avatar_url":"https://avatars1.githubusercontent.com/u/26801153?v=4","gravatar_id":"","url":"https://api.github.com/users/harsh-px","html_url":"https://github.com/harsh-px","followers_url":"https://api.github.com/users/harsh-px/followers","following_url":"https://api.github.com/users/harsh-px/following{/other_user}","gists_url":"https://api.github.com/users/harsh-px/gists{/gist_id}","starred_url":"https://api.github.com/users/harsh-px/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/harsh-px/subscriptions","organizations_url":"https://api.github.com/users/harsh-px/orgs","repos_url":"https://api.github.com/users/harsh-px/repos","events_url":"https://api.github.com/users/harsh-px/events{/privacy}","received_events_url":"https://api.github.com/users/harsh-px/received_events","type":"User","site_admin":false},"repo":{"id":87015833,"node_id":"MDEwOlJlcG9zaXRvcnk4NzAxNTgzMw==","name":"openstorage","full_name":"harsh-px/openstorage","owner":{"login":"harsh-px","id":26801153,"node_id":"MDQ6VXNlcjI2ODAxMTUz","avatar_url":"https://avatars1.githubusercontent.com/u/26801153?v=4","gravatar_id":"","url":"https://api.github.com/users/harsh-px","html_url":"https://github.com/harsh-px","followers_url":"https://api.github.com/users/harsh-px/followers","following_url":"https://api.github.com/users/harsh-px/following{/other_user}","gists_url":"https://api.github.com/users/harsh-px/gists{/gist_id}","starred_url":"https://api.github.com/users/harsh-px/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/harsh-px/subscriptions","organizations_url":"https://api.github.com/users/harsh-px/orgs","repos_url":"https://api.github.com/users/harsh-px/repos","events_url":"https://api.github.com/users/harsh-px/events{/privacy}","received_events_url":"https://api.github.com/users/harsh-px/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/harsh-px/openstorage","description":"A multi-host clustered implementation of the open storage specification","fork":true,"url":"https://api.github.com/repos/harsh-px/openstorage","forks_url":"https://api.github.com/repos/harsh-px/openstorage/forks","keys_url":"https://api.github.com/repos/harsh-px/openstorage/keys{/key_id}","collaborators_url":"https://api.github.com/repos/harsh-px/openstorage/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/harsh-px/openstorage/teams","hooks_url":"https://api.github.com/repos/harsh-px/openstorage/hooks","issue_events_url":"https://api.github.com/repos/harsh-px/openstorage/issues/events{/number}","events_url":"https://api.github.com/repos/harsh-px/openstorage/events","assignees_url":"https://api.github.com/repos/harsh-px/openstorage/assignees{/user}","branches_url":"https://api.github.com/repos/harsh-px/openstorage/branches{/branch}","tags_url":"https://api.github.com/repos/harsh-px/openstorage/tags","blobs_url":"https://api.github.com/repos/harsh-px/openstorage/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/harsh-px/openstorage/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/harsh-px/openstorage/git/refs{/sha}","trees_url":"https://api.github.com/repos/harsh-px/openstorage/git/trees{/sha}","statuses_url":"https://api.github.com/repos/harsh-px/openstorage/statuses/{sha}","languages_url":"https://api.github.com/repos/harsh-px/openstorage/languages","stargazers_url":"https://api.github.com/repos/harsh-px/openstorage/stargazers","contributors_url":"https://api.github.com/repos/harsh-px/openstorage/contributors","subscribers_url":"https://api.github.com/repos/harsh-px/openstorage/subscribers","subscription_url":"https://api.github.com/repos/harsh-px/openstorage/subscription","commits_url":"https://api.github.com/repos/harsh-px/openstorage/commits{/sha}","git_commits_url":"https://api.github.com/repos/harsh-px/openstorage/git/commits{/sha}","comments_url":"https://api.github.com/repos/harsh-px/openstorage/comments{/number}","issue_comment_url":"https://api.github.com/repos/harsh-px/openstorage/issues/comments{/number}","contents_url":"https://api.github.com/repos/harsh-px/openstorage/contents/{+path}","compare_url":"https://api.github.com/repos/harsh-px/openstorage/compare/{base}...{head}","merges_url":"https://api.github.com/repos/harsh-px/openstorage/merges","archive_url":"https://api.github.com/repos/harsh-px/openstorage/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/harsh-px/openstorage/downloads","issues_url":"https://api.github.com/repos/harsh-px/openstorage/issues{/number}","pulls_url":"https://api.github.com/repos/harsh-px/openstorage/pulls{/number}","milestones_url":"https://api.github.com/repos/harsh-px/openstorage/milestones{/number}","notifications_url":"https://api.github.com/repos/harsh-px/openstorage/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/harsh-px/openstorage/labels{/name}","releases_url":"https://api.github.com/repos/harsh-px/openstorage/releases{/id}","deployments_url":"https://api.github.com/repos/harsh-px/openstorage/deployments","created_at":"2017-04-02T20:59:46Z","updated_at":"2017-04-02T20:59:48Z","pushed_at":"2018-08-02T18:34:51Z","git_url":"git://github.com/harsh-px/openstorage.git","ssh_url":"git@github.com:harsh-px/openstorage.git","clone_url":"https://github.com/harsh-px/openstorage.git","svn_url":"https://github.com/harsh-px/openstorage","homepage":"","size":20247,"stargazers_count":0,"watchers_count":0,"language":"Go","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":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":"libopenstorage:master","ref":"master","sha":"59af493ab7a4f3eda41b25fe183e52b761f91578","user":{"login":"libopenstorage","id":13478636,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNDc4NjM2","avatar_url":"https://avatars0.githubusercontent.com/u/13478636?v=4","gravatar_id":"","url":"https://api.github.com/users/libopenstorage","html_url":"https://github.com/libopenstorage","followers_url":"https://api.github.com/users/libopenstorage/followers","following_url":"https://api.github.com/users/libopenstorage/following{/other_user}","gists_url":"https://api.github.com/users/libopenstorage/gists{/gist_id}","starred_url":"https://api.github.com/users/libopenstorage/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/libopenstorage/subscriptions","organizations_url":"https://api.github.com/users/libopenstorage/orgs","repos_url":"https://api.github.com/users/libopenstorage/repos","events_url":"https://api.github.com/users/libopenstorage/events{/privacy}","received_events_url":"https://api.github.com/users/libopenstorage/received_events","type":"Organization","site_admin":false},"repo":{"id":39651750,"node_id":"MDEwOlJlcG9zaXRvcnkzOTY1MTc1MA==","name":"openstorage","full_name":"libopenstorage/openstorage","owner":{"login":"libopenstorage","id":13478636,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzNDc4NjM2","avatar_url":"https://avatars0.githubusercontent.com/u/13478636?v=4","gravatar_id":"","url":"https://api.github.com/users/libopenstorage","html_url":"https://github.com/libopenstorage","followers_url":"https://api.github.com/users/libopenstorage/followers","following_url":"https://api.github.com/users/libopenstorage/following{/other_user}","gists_url":"https://api.github.com/users/libopenstorage/gists{/gist_id}","starred_url":"https://api.github.com/users/libopenstorage/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/libopenstorage/subscriptions","organizations_url":"https://api.github.com/users/libopenstorage/orgs","repos_url":"https://api.github.com/users/libopenstorage/repos","events_url":"https://api.github.com/users/libopenstorage/events{/privacy}","received_events_url":"https://api.github.com/users/libopenstorage/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/libopenstorage/openstorage","description":"A multi-host clustered implementation of the open storage specification","fork":false,"url":"https://api.github.com/repos/libopenstorage/openstorage","forks_url":"https://api.github.com/repos/libopenstorage/openstorage/forks","keys_url":"https://api.github.com/repos/libopenstorage/openstorage/keys{/key_id}","collaborators_url":"https://api.github.com/repos/libopenstorage/openstorage/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/libopenstorage/openstorage/teams","hooks_url":"https://api.github.com/repos/libopenstorage/openstorage/hooks","issue_events_url":"https://api.github.com/repos/libopenstorage/openstorage/issues/events{/number}","events_url":"https://api.github.com/repos/libopenstorage/openstorage/events","assignees_url":"https://api.github.com/repos/libopenstorage/openstorage/assignees{/user}","branches_url":"https://api.github.com/repos/libopenstorage/openstorage/branches{/branch}","tags_url":"https://api.github.com/repos/libopenstorage/openstorage/tags","blobs_url":"https://api.github.com/repos/libopenstorage/openstorage/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/libopenstorage/openstorage/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/libopenstorage/openstorage/git/refs{/sha}","trees_url":"https://api.github.com/repos/libopenstorage/openstorage/git/trees{/sha}","statuses_url":"https://api.github.com/repos/libopenstorage/openstorage/statuses/{sha}","languages_url":"https://api.github.com/repos/libopenstorage/openstorage/languages","stargazers_url":"https://api.github.com/repos/libopenstorage/openstorage/stargazers","contributors_url":"https://api.github.com/repos/libopenstorage/openstorage/contributors","subscribers_url":"https://api.github.com/repos/libopenstorage/openstorage/subscribers","subscription_url":"https://api.github.com/repos/libopenstorage/openstorage/subscription","commits_url":"https://api.github.com/repos/libopenstorage/openstorage/commits{/sha}","git_commits_url":"https://api.github.com/repos/libopenstorage/openstorage/git/commits{/sha}","comments_url":"https://api.github.com/repos/libopenstorage/openstorage/comments{/number}","issue_comment_url":"https://api.github.com/repos/libopenstorage/openstorage/issues/comments{/number}","contents_url":"https://api.github.com/repos/libopenstorage/openstorage/contents/{+path}","compare_url":"https://api.github.com/repos/libopenstorage/openstorage/compare/{base}...{head}","merges_url":"https://api.github.com/repos/libopenstorage/openstorage/merges","archive_url":"https://api.github.com/repos/libopenstorage/openstorage/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/libopenstorage/openstorage/downloads","issues_url":"https://api.github.com/repos/libopenstorage/openstorage/issues{/number}","pulls_url":"https://api.github.com/repos/libopenstorage/openstorage/pulls{/number}","milestones_url":"https://api.github.com/repos/libopenstorage/openstorage/milestones{/number}","notifications_url":"https://api.github.com/repos/libopenstorage/openstorage/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/libopenstorage/openstorage/labels{/name}","releases_url":"https://api.github.com/repos/libopenstorage/openstorage/releases{/id}","deployments_url":"https://api.github.com/repos/libopenstorage/openstorage/deployments","created_at":"2015-07-24T19:01:34Z","updated_at":"2018-08-02T01:50:31Z","pushed_at":"2018-08-02T21:43:49Z","git_url":"git://github.com/libopenstorage/openstorage.git","ssh_url":"git@github.com:libopenstorage/openstorage.git","clone_url":"https://github.com/libopenstorage/openstorage.git","svn_url":"https://github.com/libopenstorage/openstorage","homepage":"","size":23062,"stargazers_count":295,"watchers_count":295,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":56,"mirror_url":null,"archived":false,"open_issues_count":74,"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":56,"open_issues":74,"watchers":295,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/libopenstorage/openstorage/pulls/442"},"html":{"href":"https://github.com/libopenstorage/openstorage/pull/442"},"issue":{"href":"https://api.github.com/repos/libopenstorage/openstorage/issues/442"},"comments":{"href":"https://api.github.com/repos/libopenstorage/openstorage/issues/442/comments"},"review_comments":{"href":"https://api.github.com/repos/libopenstorage/openstorage/pulls/442/comments"},"review_comment":{"href":"https://api.github.com/repos/libopenstorage/openstorage/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/libopenstorage/openstorage/pulls/442/commits"},"statuses":{"href":"https://api.github.com/repos/libopenstorage/openstorage/statuses/963c270341c02e7604aee9c3913b93038227b10f"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"adityadani"}}