Skip to content

Commit 0529930

Browse files
author
Cloud User
committed
Adding python model versioning capabilities and fix python wrapper score handle null/none inputs
1 parent 7abea61 commit 0529930

File tree

5 files changed

+694
-40
lines changed

5 files changed

+694
-40
lines changed

src/sasctl/_services/model_repository.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"""The Model Repository service supports registering and managing models."""
88

99
from .service import Service
10-
from ..core import current_session, get
10+
from ..core import current_session, get, delete
1111

1212
FUNCTIONS = {'Analytical', 'Classification', 'Clustering', 'Forecasting',
1313
'Prediction', 'Text categorization', 'Text extraction',
@@ -497,3 +497,24 @@ def copy_analytic_store(cls, model):
497497
model = cls.get_model(model, refresh=True)
498498

499499
return cls.request_link(model, 'copyAnalyticStore')
500+
501+
502+
@classmethod
503+
def delete_model_contents(cls, model):
504+
"""Deletes all contents (files) in the model.
505+
506+
Parameters
507+
----------
508+
model : str or dict
509+
The name, id, or dictionary representation of a model.
510+
511+
Returns
512+
-------
513+
514+
"""
515+
rel = 'delete'
516+
517+
filelist=cls.get_model_contents(model)
518+
for delfile in filelist:
519+
modelfileuri=cls.get_link(delfile, rel)
520+
delete(modelfileuri['uri'])

src/sasctl/tasks.py

Lines changed: 13 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from six.moves.urllib.error import HTTPError
1919

2020
from . import utils
21-
from .core import RestObj, current_session, get, get_link, request_link
21+
from .core import RestObj, current_session, get, get_link, request_link, delete
2222
from .exceptions import AuthorizationError
2323
from .services import model_management as mm
2424
from .services import model_publish as mp
@@ -136,41 +136,6 @@ def register_model(model, name, project, repository=None, input=None,
136136
# If version not specified, default to creating a new version
137137
version = version or 'new'
138138

139-
# If replacing an existing version, make sure the model version exists
140-
if str(version).lower() != 'new':
141-
model_obj = mr.get_model(name)
142-
if model_obj is None:
143-
raise ValueError("Unable to update version '%s' of model '%s%. "
144-
"Model not found." % (version, name))
145-
model_versions = request_link(model_obj, 'modelVersions')
146-
assert isinstance(model_versions, list)
147-
148-
# Use 'new' to create a new version if one doesn't exist yet.
149-
if len(model_versions) == 0:
150-
raise ValueError("No existing version of model '%s' to update."
151-
% name)
152-
153-
# Help function for extracting version number of REST response
154-
def get_version(x):
155-
return float(x.get('modelVersionName', 0))
156-
157-
if str(version).isnumeric():
158-
match = [x for x in model_versions if float(version) ==
159-
get_version(x)]
160-
assert len(match) <= 1
161-
162-
match = match[0] if len(match) else None
163-
elif str(version).lower() == 'latest':
164-
# Sort by version number and get first
165-
match = sorted(model_versions, key=get_version)[0]
166-
else:
167-
raise ValueError("Unrecognized version '%s'." % version)
168-
169-
# TODO: get ID of correct model version
170-
# if version != new, get existing model
171-
# get model (modelVersions) rel
172-
# -> returns list w/ id, modelVersionName, etc
173-
174139
files = files or []
175140

176141
# Find the project if it already exists
@@ -340,7 +305,18 @@ def get_version(x):
340305
project['eventProbabilityVariable'] = prediction_variable
341306
mr.update_project(project)
342307

343-
model = mr.create_model(model, project)
308+
# If replacing an existing version, make sure the model version exists
309+
if str(version).lower() != 'new':
310+
#Update an existing model with new files
311+
model_obj = mr.get_model(name)
312+
if model_obj is None:
313+
raise ValueError("Unable to update version '%s' of model '%s%. "
314+
"Model not found." % (version, name))
315+
model = mr.create_model_version(name)
316+
mr.delete_model_contents(model)
317+
else:
318+
#Assume new model to create
319+
model = mr.create_model(model, project)
344320

345321
assert isinstance(model, RestObj)
346322

0 commit comments

Comments
 (0)