odps/models/ml/offlinemodel.py (54 lines of code) (raw):

#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright 1999-2024 Alibaba Group Holding Ltd. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from ... import serializers, utils from ...compat import urlparse from ..core import LazyLoad class OfflineModelInfo(serializers.XMLSerializableModel): _root = "Offlinemodel" name = serializers.XMLNodeField("Name", default="") model_path = serializers.XMLNodeField("ModelPath", default="") role_arn = serializers.XMLNodeField("Rolearn") type = serializers.XMLNodeField("Type") version = serializers.XMLNodeField("Version") processor = serializers.XMLNodeField("Processor") configuration = serializers.XMLNodeField("Configuration") src_project = serializers.XMLNodeField("SrcProject") src_model = serializers.XMLNodeField("SrcModel") dest_project = serializers.XMLNodeField("DestProject") dest_model = serializers.XMLNodeField("DestModel") class OfflineModel(LazyLoad): """ Representing an ODPS offline model. """ name = serializers.XMLNodeField("Name") owner = serializers.XMLNodeField("Owner") creation_time = serializers.XMLNodeField( "CreationTime", parse_callback=utils.parse_rfc822 ) last_modified_time = serializers.XMLNodeField( "LastModifiedTime", parse_callback=utils.parse_rfc822 ) def reload(self): resp = self._client.get(self.resource()) self.parse(self._client, resp, obj=self) def get_model(self): """ Get PMML text of the current model. Note that model file obtained via this method might be incomplete due to size limitations. """ url = self.resource() resp = self._client.get(url, action="data") return resp.text @utils.with_wait_argument def copy(self, new_name, new_project=None, async_=False): """ Copy current model into a new location. :param new_name: name of the new model :param new_project: new project name. if absent, original project name will be used :param async_: if True, return the copy instance. otherwise return the newly-copied model """ url = self.parent.resource() new_project = new_project or self.project.name info = OfflineModelInfo( src_model=self.name, src_project=self.project.name, dest_model=new_name, dest_project=new_project, ) headers = {"Content-Type": "application/xml"} resp = self._client.post(url, info.serialize(), headers=headers) inst_url = resp.headers["Location"].rstrip("/") inst_id = urlparse(inst_url).path.rsplit("/", 1)[-1] inst = self.project.instances[inst_id] if not async_: inst.wait_for_success() return self.parent[new_name] else: return inst def drop(self): self.parent.delete(self)