Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
CloudPak-Outcomes
GitHub Repository: CloudPak-Outcomes/Outcomes-Projects
Path: blob/main/L4assets/DSandMLOpsAssets/CLIandSDK/packages/cpdalllibs/commonlib/projectmgmt.py
1928 views
1
import requests
2
from cpdalllibs.commonlib.constants import *
3
import base64
4
import subprocess
5
6
def getProject(headersAPI, guid, url=None, cpdaas=False) :
7
"""Get a project using a project id"""
8
if url is None :
9
url = WATSON_DATA_ENDPOINT
10
headersAPI['cpdaas-include-permissions'] = "true"
11
if url[-1] != "/" :
12
url = url + "/"
13
endpoint = url + 'v2/projects/{}'.format(guid)
14
resp = requests.get(endpoint, headers=headersAPI)
15
return(resp)
16
17
def getProjects(headersAPI, url=None, account_id=None) :
18
"""Get a list of projects
19
The account_id is used in CPDaaS only
20
"""
21
if url == None :
22
url = WATSON_DATA_ENDPOINT + "/"
23
if 'cpdaas-include-permissions' not in headersAPI :
24
headersAPI['cpdaas-include-permissions'] = "true"
25
limit = 100 # maximum number of return values. Default 10
26
projects_json = []
27
projects = "v2/projects?include=everything&limit=100"
28
if account_id is not None :
29
projects = projects + "&bss_account_id={}".format(account_id)
30
headersAPI['cpdaas-include-permissions'] = "true"
31
loop=True
32
first = True
33
while loop :
34
if first is True :
35
resp = requests.get(url + projects, headers=headersAPI)
36
first = False
37
else :
38
resp = requests.get("{}{}&bookmark={}".format(url, projects, resp_json['bookmark']), headers=headersAPI)
39
if resp.status_code > 202 : # if error
40
print("Status code: {}, reason: {}".format(resp.status_code,resp.reason))
41
resp_json = resp.json()
42
if (resp_json['total_results'] == 0) :
43
loop = False
44
else :
45
projects_json.extend(resp_json['resources'])
46
return(projects_json)
47
48
def getProjectMembers(headersAPI, url, id):
49
if 'cpdaas-include-permissions' not in headersAPI :
50
headersAPI['cpdaas-include-permissions'] = "true"
51
resp = requests.get(url + 'v2/projects/{}/members'.format(id),
52
headers=headersAPI)
53
return resp
54
55
def addUserToProject(headersAPI, user_email, iam_id, project_id, role="editor"):
56
data = {
57
"members": [{
58
"role": role,
59
"state": "ACTIVE", # default "ACTIVE"
60
"id": iam_id,
61
"user_name": user_email
62
}]
63
}
64
if 'cpdaas-include-permissions' not in headersAPI :
65
headersAPI['cpdaas-include-permissions'] = "true"
66
resp = requests.post(WATSON_DATA_ENDPOINT + '/v2/projects/{}/members'.format(project_id),
67
json=data, headers=headersAPI)
68
return(resp)
69
70
def addWMLToProject(headersAPI,project_id, ml) :
71
compute = [{
72
'type': "machine_learning", # From doc
73
'guid': ml['guid'],
74
'name': ml['name'],
75
'credentials': {},
76
'crn': ml['crn'] # optional
77
}]
78
payload = {
79
'compute': compute
80
}
81
if 'cpdaas-include-permissions' not in headersAPI :
82
headersAPI['cpdaas-include-permissions'] = "true"
83
resp = requests.patch(WATSON_DATA_ENDPOINT + '/v2/projects/{}'.format(project_id),
84
json=payload, headers=headersAPI)
85
return(resp)
86
87
def deleteProjectMember(headersAPI, prj_id, email) :
88
if 'cpdaas-include-permissions' not in headersAPI :
89
headersAPI['cpdaas-include-permissions'] = "true"
90
resp = requests.delete(WATSON_DATA_ENDPOINT + '/v2/projects/{}/members/{}'.format(prj_id, email),
91
headers=headersAPI)
92
if resp.status_code > 204 : # if error
93
print("Status code: {}, reason: {}".format(resp.status_code,resp.reason))
94
return resp
95
96
def cre8Project(headersAPI, project_desc, url=None):
97
payload = {
98
"name": project_desc["name"],
99
"generator": project_desc["generator"],
100
"storage": {
101
"type": project_desc['storage']['type'],
102
"guid": project_desc['storage']['guid'],
103
"delegated": False # default
104
},
105
"description": project_desc["description"],
106
"public": False, # default
107
"tags": ["project"],
108
"enforce_members": True,
109
"tools": ["jupyter_notebooks", "spss_modeler",
110
"experiments", "data_refinery"]
111
}
112
if project_desc['storage']['resource_key_crn'] is not None :
113
payload['storage']['resource_crn'] = project_desc['storage']['resource_key_crn']
114
if url is None :
115
url = WATSON_DATA_ENDPOINT
116
if url[-1] != "/" :
117
url = url + "/"
118
endpoint = url + 'transactional/v2/projects'
119
resp = requests.post(endpoint, json=payload, headers=headersAPI)
120
if resp.status_code > 204:
121
print("create_project: Status code: {}, reason: {}".format(
122
resp.status_code, resp.reason))
123
print(payload)
124
print(resp.text)
125
if resp.status_code > 220:
126
project_id = None
127
else:
128
resp_json = resp.json()
129
project_id = resp_json['location'].split('/')[-1]
130
# print(json.dumps(resp_json, indent=2, sort_keys=False))
131
return(project_id)
132
133
def deleteProject(headersAPI, url=None, id=None) :
134
if url == None :
135
url = WATSON_DATA_ENDPOINT + "/"
136
if 'cpdaas-include-permissions' not in headersAPI :
137
headersAPI['cpdaas-include-permissions'] = "true"
138
resp = requests.delete(url + 'transactional/v2/projects/{}'.format(id),
139
headers=headersAPI)
140
return resp
141
142
143