def create_or_update_stream(self, namespace_id, stream):
        """Tells SDS Service to create a stream based on the local 'stream'
        SdsStream object"""
        if namespace_id is None:
            raise TypeError
        if stream is None or not isinstance(stream, SdsStream):
            raise TypeError
        req_url = self.url + self.__streamsPath.format(
            tenant_id=self.tenantId,
            namespace_id=namespace_id,
            stream_id=stream.Id)

        payload = stream.to_json()
        headers = self.__sds_headers()

        response = requests.put(url=req_url, data=payload, headers=headers)
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            cleanup(self, namespace_id, self.type_names)
            raise SdsError("Failed to create SdsStream, {stream_id}. "
                           "{status}:{reason}".format(
                               stream_id=stream.Id,
                               status=response.status_code,
                               reason=response.text))

        response.close()
예제 #2
0
    def replace_values(self, namespace_id, stream_id, values):
        """Tells Sds Service to replace the values defined by the list 'values'"""
        if namespace_id is None:
            raise TypeError
        if stream_id is None:
            raise TypeError
        if values is None:
            raise TypeError

        if callable(getattr(values[0], "to_json", None)):
            events = []
            for value in values:
                events.append(value.to_dictionary())
            payload = json.dumps(events)
        else:
            payload = values

        response = requests.put(
            self.url +
            self.__replaceValuesPath.format(tenant_id=self.tenantId,
                                            namespace_id=namespace_id,
                                            stream_id=stream_id),
            data=payload,
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            raise SdsError(
                "Failed to replace value for SdsStream, {stream_id}. {status}:{reason}"
                .format(stream_id=stream_id,
                        status=response.status_code,
                        reason=response.text))

        response.close()
예제 #3
0
    def update_value(self, namespace_id, stream_id, value):
        """Tells SDS Service to update the value described by 'value', a local
        SdsValue object"""
        if namespace_id is None:
            raise TypeError
        if stream_id is None:
            raise TypeError
        if value is None:
            raise TypeError

        time = value.time
        sleepHours = str(value.__getattribute__("sleep"))
        payload = "[{'time': '" + time + "','sleep': " + sleepHours + "}]"
        # payload = [{"Time": "2017-11-23T19:00:00Z", "SleepHours": "10292"}]
        req_url = self.url + self.__updateValuePath.format(
            tenant_id=self.tenantId,
            namespace_id=namespace_id,
            stream_id=stream_id)

        h = self.__sds_headers()
        response = requests.put(url=req_url, data=payload, headers=h)
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            raise SdsError(
                "Failed to update value for SdsStream, {}. {}:{}".format(
                    stream_id, response.status_code, response.text))
        response.close()
예제 #4
0
    def replace_value(self, namespace_id, stream_id, value):
        """Tells Sds Service to replace the value specified by 'value'"""
        if namespace_id is None:
            raise TypeError
        if stream_id is None:
            raise TypeError
        if value is None:
            raise TypeError

        if callable(getattr(value, "to_json", None)):
            payload = value.to_json()
        else:
            payload = value

        response = requests.put(
            self.url +
            self.__replaceValuePath.format(tenant_id=self.tenantId,
                                           namespace_id=namespace_id,
                                           stream_id=stream_id),
            data=payload,
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            raise SdsError(
                "Failed to replace value for SdsStream, {stream_id}. {status}:{reason}"
                .format(stream_id=stream_id,
                        status=response.status_code,
                        reason=response.text))

        response.close()
예제 #5
0
    def get_type_reference_count(self, namespace_id, type_id):
        """Retrieves the number of times the type is referenced"""
        if namespace_id is None:
            raise TypeError
        if type_id is None:
            raise TypeError

        response = requests.get(
            self.url + self.__typesPath.format(tenant_id=self.tenantId,
                                               namespace_id=namespace_id,
                                               type_id=type_id) +
            "/ReferenceCount",
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            cleanup(self, namespace_id, self.type_names)
            raise SdsError(
                "Failed to get SdsType reference count, {type_id}. {status}:{reason}"
                .format(type_id=type_id,
                        status=response.status_code,
                        reason=response.text))

        count = json.loads(response.content)
        response.close()
        return int(count)
예제 #6
0
    def insert_values(self, namespace_id, stream_id, values):
        """Tells Sds Service to insert the values, defined by the list 'values', into
        the stream specified by 'stream_id'"""
        if namespace_id is None:
            raise TypeError
        if stream_id is None:
            raise TypeError
        if values is None:
            raise TypeError

        if callable(getattr(values[0], "to_json", None)):
            events = []
            for value in values:
                time.sleep(0.5)
                events.append(value.to_dictionary())
            payload = json.dumps(events)
        else:
            payload = values

        response = requests.post(
            self.url +
            self.__insertValuesPath.format(tenant_id=self.tenantId,
                                           namespace_id=namespace_id,
                                           stream_id=stream_id),
            data=payload,
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            cleanup(self, namespace_id, self.type_names)
            raise SdsError(
                "Failed to insert multiple values for SdsStream, {stream_id}. {status}:{reason}"
                .format(stream_id=stream_id,
                        status=response.status_code,
                        reason=response.text))
예제 #7
0
    def update_value(self, namespace_id, stream_id, value):
        """Tells Sds Service to update the value described by 'value', a local SdsValue object"""
        if namespace_id is None:
            raise TypeError
        if stream_id is None:
            raise TypeError
        if value is None:
            raise TypeError

        if callable(getattr(value, "to_json", None)):
            payload = value.to_json()
        else:
            payload = value

        response = requests.put(
            self.url + self.__updateValuePath.format(tenant_id=self.tenantId,
                                                     namespace_id=namespace_id,
                                                     stream_id=stream_id),
            data=payload,
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            raise SdsError(
                "Failed to update value for SdsStream, {}. {}:{}".format(
                    stream_id, response.status_code, response.text))

        response.close()
예제 #8
0
    def get_or_create_stream(self, namespace_id, stream):
        """Tells Sds Service to create a stream based on the local 'stream' SdsStream object"""
        if namespace_id is None:
            raise TypeError
        if stream is None or not isinstance(stream, SdsStream):
            raise TypeError
        response = requests.post(
            self.url + self.__streamsPath.format(tenant_id=self.tenantId,
                                                 namespace_id=namespace_id,
                                                 stream_id=stream.Id),
            data=stream.to_json(),
            headers=self.__sds_headers())

        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            cleanup(self, namespace_id, self.type_names)
            raise SdsError(
                "Failed to create SdsStream, {stream_id}. {status}:{reason}".
                format(stream_id=stream.Id,
                       status=response.status_code,
                       reason=response.text))

        stream = SdsStream.from_json(json.loads(response.content))
        response.close()
        return stream
예제 #9
0
    def get_last_value(self, namespace_id, stream_id, value_class, view_id=""):
        """Retrieves JSON object from Sds Service the last value to be added to the stream specified by 'stream_id'"""
        if namespace_id is None:
            raise TypeError
        if stream_id is None:
            raise TypeError
        if value_class is None:
            raise TypeError

        response = requests.get(
            self.url + self.__getLastValue.format(tenant_id=self.tenantId,
                                                  namespace_id=namespace_id,
                                                  stream_id=stream_id,
                                                  view_id=view_id),
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            raise SdsError(
                "Failed to get last value for SdsStream {stream_id}. {status}:{reason}"
                .format(stream_id=stream_id,
                        status=response.status_code,
                        reason=response.text))

        content = json.loads(response.content)
        response.close()
        return value_class.from_json(content)
예제 #10
0
    def remove_window_value(self, namespace_id, stream_id, start, end):
        """Tells Sds Service to delete a window of values in the stream specified by 'stream_id'"""
        if namespace_id is None:
            raise TypeError
        if stream_id is None:
            raise TypeError
        if start is None:
            raise TypeError
        if end is None:
            raise TypeError

        response = requests.delete(
            self.url +
            self.__removeWindowValues.format(tenant_id=self.tenantId,
                                             namespace_id=namespace_id,
                                             stream_id=stream_id,
                                             start=start,
                                             end=end),
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            raise SdsError(
                "Failed to remove all values for SdsStream, {}. {}:{}".format(
                    stream_id, response.status_code, response.text))

        response.close()
예제 #11
0
    def get_streams(self, namespace_id, query="", skip=0, count=100):
        """Retrieves a list of streams associated with 'namespace_id' under the current tenant"""
        if namespace_id is None:
            raise TypeError
        if query is None:
            raise TypeError

        response = requests.get(
            self.url + self.__getStreamsPath.format(tenant_id=self.tenantId,
                                                    namespace_id=namespace_id,
                                                    query=query,
                                                    skip=skip,
                                                    count=count),
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            cleanup(self, namespace_id, self.type_names)
            raise SdsError(
                "Failed to get all SdsStreams. {status}:{reason}".format(
                    status=response.status_code, reason=response.text))

        content = json.loads(response.content)
        results = []
        for item in content:
            results.append(SdsStream.from_json(item))
        response.close()
        return results
예제 #12
0
    def get_stream_type(self, namespace_id, stream_id):
        """Retrieves a stream specified by 'stream_id' from the Sds Service"""
        if namespace_id is None:
            raise TypeError
        if stream_id is None:
            raise TypeError

        response = requests.get(
            self.url + self.__streamsPath.format(tenant_id=self.tenantId,
                                                 namespace_id=namespace_id,
                                                 stream_id=stream_id) +
            "/Type",
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            cleanup(self, namespace_id, self.type_names)
            raise SdsError(
                "Failed to get SdsStream, {stream_id}. {status}:{reason}".
                format(stream_id=stream_id,
                       status=response.status_code,
                       reason=response.text))

        event_type = SdsType.from_json(json.loads(response.content))
        response.close()
        return event_type
예제 #13
0
    def get_or_create_type(self, namespace_id, event_type):
        """Tells Sds Service to create a type based on local 'type' or get if existing type matches"""
        if namespace_id is None:
            raise TypeError
        if event_type is None or not isinstance(event_type, SdsType):
            raise TypeError

        req_url = self.url + self.__typesPath.format(tenant_id=self.tenantId,
                                                     namespace_id=namespace_id,
                                                     type_id=event_type.Id)
        response = requests.post(url=req_url,
                                 data=event_type.to_json(),
                                 headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            cleanup(self, namespace_id, self.type_names)
            raise SdsError(
                "Failed to create type, {type_id}. {status}:{reason}".format(
                    type_id=event_type.Id,
                    status=response.status_code,
                    reason=response.text))

        event_type = SdsType.from_json(json.loads(response.content))
        response.close()
        return event_type
예제 #14
0
    def get_window_values(self,
                          namespace_id,
                          stream_id,
                          value_class,
                          start,
                          end,
                          streamView_id=""):
        """Retrieves JSON object representing a window of values from the stream specified by 'stream_id'"""
        if namespace_id is None:
            raise TypeError
        if stream_id is None:
            raise TypeError
        if value_class is None:
            raise TypeError
        if start is None:
            raise TypeError
        if end is None:
            raise TypeError

        response = requests.get(
            self.url +
            self.__getWindowValues.format(tenant_id=self.tenantId,
                                          namespace_id=namespace_id,
                                          stream_id=stream_id,
                                          start=start,
                                          end=end,
                                          streamView_id=streamView_id),
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            raise SdsError(
                "Failed to get window values for SdsStream {stream_id}. {status}:{reason}"
                .format(stream_id=stream_id,
                        status=response.status_code,
                        reason=response.text))

        content = json.loads(response.content)
        response.close()

        values = []
        for c in content:
            values.append(value_class.from_dictionary(c))
        return values
예제 #15
0
    def create_or_update_metadata(self, namespace_id, stream_id, metadata):
        """Tells Sds Service to create metadata and associate them with the given streamid"""
        if namespace_id is None:
            raise TypeError

        response = requests.put(
            self.url + self.__streamsPath.format(tenant_id=self.tenantId,
                                                 namespace_id=namespace_id,
                                                 stream_id=stream_id) +
            "/Metadata",
            data=json.dumps(metadata),
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            cleanup(self, namespace_id, self.type_names)
            raise SdsError(
                "Failed to create metadata for Stream: {stream_id}. {status}:{reason}"
                .format(stream_id=stream_id,
                        status=response.status_code,
                        reason=response.text))
예제 #16
0
    def delete_stream(self, namespace_id, stream_id):
        """Tells Sds Service to delete the stream speficied by 'stream_id'"""
        if namespace_id is None:
            raise TypeError
        if stream_id is None:
            raise TypeError

        response = requests.delete(
            self.url + self.__streamsPath.format(tenant_id=self.tenantId,
                                                 namespace_id=namespace_id,
                                                 stream_id=stream_id),
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            raise SdsError(
                "Failed to delete SdsStream, {stream_id}. {status}:{reason}".
                format(stream_id=stream_id,
                       status=response.status_code,
                       reason=response.text))

        response.close()
    def delete_type(self, namespace_id, type_id):
        """Tells SDS Service to delete the type specified by 'type_id'"""
        if namespace_id is None:
            raise TypeError
        if type_id is None:
            raise TypeError

        response = requests.delete(
            self.url + self.__typesPath.format(tenant_id=self.tenantId,
                                               namespace_id=namespace_id,
                                               type_id=type_id),
            headers=self.__sds_headers())

        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            raise SdsError("Failed to delete SdsType, "
                           "{type_id}. {status}:{reason}".format(
                               type_id=type_id,
                               status=response.status_code,
                               reason=response.text))
        response.close()
예제 #18
0
    def create_or_update_type(self, namespace_id, event_type):
        """Tells Sds Service to create a type based on local 'type' object"""
        if namespace_id is None:
            raise TypeError
        if event_type is None or not isinstance(event_type, SdsType):
            raise TypeError

        response = requests.put(self.url + self.__typesPath.format(
            self.tenantId, namespace_id, event_type.Id),
                                data=event_type.to_json(),
                                headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            cleanup(self, namespace_id, self.type_names)
            raise SdsError(
                "Failed to create type, {type_id}. {status}:{reason}".format(
                    type_id=event_type.Id,
                    status=response.status_code,
                    reason=response.text))

        response.close()
예제 #19
0
    def get_metadata(self, namespace_id, stream_id, key):
        """Tells Sds Service to get metadata associated with the given streamid and key"""
        if namespace_id is None:
            raise TypeError

        response = requests.get(
            self.url + self.__streamsPath.format(tenant_id=self.tenantId,
                                                 namespace_id=namespace_id,
                                                 stream_id=stream_id) +
            "/Metadata/" + key,
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            raise SdsError(
                "Failed to get metadata for Stream: {stream_id} and Key {key}. {status}:{reason}"
                .format(stream_id=stream_id,
                        status=response.status_code,
                        key=key,
                        reason=response.text))

        content = json.loads(response.content)
        response.close()
        return content
예제 #20
0
    def get_tags(self, namespace_id, stream_id):
        """Tells Sds Service to get tags associated with the given streamid """
        if namespace_id is None:
            raise TypeError

        response = requests.get(
            self.url + self.__streamsPath.format(tenant_id=self.tenantId,
                                                 namespace_id=namespace_id,
                                                 stream_id=stream_id) +
            "/Tags",
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            cleanup(self, namespace_id, self.type_names)
            raise SdsError(
                "Failed to get tags for Stream: {stream_id}. {status}:{reason}"
                .format(stream_id=stream_id,
                        status=response.status_code,
                        reason=response.text))

        content = json.loads(response.content)
        response.close()
        return content
예제 #21
0
    def get_types(self, namespace_id, skip=0, count=100):
        """Retrieves a list of types associated with the specified 'namespace_id' under the current tenant"""
        if namespace_id is None:
            raise TypeError

        response = requests.get(
            self.url + self.__getTypesPath.format(tenant_id=self.tenantId,
                                                  namespace_id=namespace_id,
                                                  skip=skip,
                                                  count=count),
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            cleanup(self, namespace_id, self.type_names)
            raise SdsError(
                "Failed to get all SdsTypes. {status}:{reason}".format(
                    status=response.status_code, reason=response.text))

        types = json.loads(response.content)
        results = []
        for t in types:
            results.append(SdsType.from_json(t))
        response.close()
        return results
예제 #22
0
    def remove_value(self, namespace_id, stream_id, key):
        """Tells Sds Service to delete the value with a key property matching 'key'"""
        if namespace_id is None:
            raise TypeError
        if stream_id is None:
            raise TypeError
        if key is None:
            raise TypeError

        response = requests.delete(
            self.url + self.__removeValue.format(tenant_id=self.tenantId,
                                                 namespace_id=namespace_id,
                                                 stream_id=stream_id,
                                                 index=key),
            headers=self.__sds_headers())
        if response.status_code < 200 or response.status_code >= 300:
            response.close()
            raise SdsError(
                "Failed to remove value for SdsStream, {stream_id}. {status}:{reason}"
                .format(stream_id=stream_id,
                        status=response.status_code,
                        reason=response.text))

        response.close()