From 03a74fb8a71891be0259fea2c4a93f62e7159c17 Mon Sep 17 00:00:00 2001 From: garciay <yann.garcia@fscom.fr> Date: Thu, 27 Mar 2025 13:55:59 +0100 Subject: [PATCH] Add IoT subscriptions --- charts/meep-sss/templates/deployment.yaml | 2 +- charts/meep-sss/templates/service.yaml | 4 +- charts/meep-sss/values-template.yaml | 4 +- go-apps/meep-sss/Dockerfile | 2 +- go-apps/meep-sss/sbi/sss-sbi.go | 12 +- go-apps/meep-sss/server/meep-sss.go | 6 +- .../meep-sss-mgr/SssMgrBindingProtocol.go | 4 +- go-packages/meep-sss-mgr/http.go | 67 +- go-packages/meep-sss-mgr/mqtt.go | 40 +- go-packages/meep-sss-mgr/onem2m-mgr.go | 284 ++- go-packages/meep-sss-mgr/onem2m-mgr_test.go | 1557 +++++++++-------- 11 files changed, 1123 insertions(+), 859 deletions(-) diff --git a/charts/meep-sss/templates/deployment.yaml b/charts/meep-sss/templates/deployment.yaml index 3783dbc2c..da7ba4957 100644 --- a/charts/meep-sss/templates/deployment.yaml +++ b/charts/meep-sss/templates/deployment.yaml @@ -35,7 +35,7 @@ spec: ports: - containerPort: {{ .Values.deployment.port }} protocol: {{ .Values.deployment.protocol }} - - containerPort: 33122 + - containerPort: 31122 protocol: TCP env: {{- range $key, $value := .Values.image.env }} diff --git a/charts/meep-sss/templates/service.yaml b/charts/meep-sss/templates/service.yaml index b5c7947b6..ddfd90a98 100644 --- a/charts/meep-sss/templates/service.yaml +++ b/charts/meep-sss/templates/service.yaml @@ -21,8 +21,8 @@ spec: nodePort: {{ .Values.service.nodePort }} {{- end }} - name: onem2m - port: 33122 - targetPort: 33122 + port: 31122 + targetPort: 31122 {{- if .Values.prometheus.monitor.enabled}} - name: metrics port: {{ .Values.prometheus.monitor.port }} diff --git a/charts/meep-sss/values-template.yaml b/charts/meep-sss/values-template.yaml index 6455ce203..08082698d 100644 --- a/charts/meep-sss/values-template.yaml +++ b/charts/meep-sss/values-template.yaml @@ -52,12 +52,12 @@ ingress: - path: /{{.SandboxName}}/{{.MepName}}/sens port: 80 - path: /{{.SandboxName}}/{{.MepName}}/onem2m - port: 33122 + port: 31122 {{- else }} - path: /{{.SandboxName}}/sens port: 80 - path: /{{.SandboxName}}/onem2m - port: 33122 + port: 31122 {{- end }} annotations: kubernetes.io/ingress.class: nginx diff --git a/go-apps/meep-sss/Dockerfile b/go-apps/meep-sss/Dockerfile index d5d291efa..55202c3c4 100644 --- a/go-apps/meep-sss/Dockerfile +++ b/go-apps/meep-sss/Dockerfile @@ -22,6 +22,6 @@ RUN chmod +x /entrypoint.sh RUN dpkg --configure -a -EXPOSE 33122/tcp +EXPOSE 31122/tcp ENTRYPOINT ["/entrypoint.sh"] diff --git a/go-apps/meep-sss/sbi/sss-sbi.go b/go-apps/meep-sss/sbi/sss-sbi.go index 420ca6d17..28fee7297 100644 --- a/go-apps/meep-sss/sbi/sss-sbi.go +++ b/go-apps/meep-sss/sbi/sss-sbi.go @@ -65,9 +65,9 @@ type SbiCfg struct { Port int HostId string Name string - DiscoveryNotify func() - StatusNotify func() - DataNotify func() + DiscoveryNotify func(map[string]interface{}) + StatusNotify func(map[string]interface{}) + DataNotify func(map[string]interface{}) ScenarioNameCb func(string) CleanUpCb func() } @@ -89,9 +89,9 @@ type SssSbi struct { port int hostId string name string - discoveryNotify func() - statusNotify func() - dataNotify func() + discoveryNotify func(map[string]interface{}) + statusNotify func(map[string]interface{}) + dataNotify func(map[string]interface{}) updateScenarioNameCB func(string) cleanUpCB func() mutex sync.Mutex diff --git a/go-apps/meep-sss/server/meep-sss.go b/go-apps/meep-sss/server/meep-sss.go index ba44fb2ac..d07e22f94 100644 --- a/go-apps/meep-sss/server/meep-sss.go +++ b/go-apps/meep-sss/server/meep-sss.go @@ -1767,17 +1767,17 @@ func sendExpiryNotification(notifyUrl string, notification ExpiryNotification) { * @param {struct} notification contains notification body of type SensorDiscoveryEventNotification * @see ETSI GS MEC 046 V3.1.1 (2024-04) Clause 7 */ -func discoveryNotify() { +func discoveryNotify(map[string]interface{}) { log.Debug(">>> sendTestNotification: discoveryNotify") } -func statusNotify() { +func statusNotify(map[string]interface{}) { log.Debug(">>> sendTestNotification: statusNotify") } -func dataNotify() { +func dataNotify(map[string]interface{}) { log.Debug(">>> sendTestNotification: dataNotify") } diff --git a/go-packages/meep-sss-mgr/SssMgrBindingProtocol.go b/go-packages/meep-sss-mgr/SssMgrBindingProtocol.go index 07585187a..86f4481c2 100644 --- a/go-packages/meep-sss-mgr/SssMgrBindingProtocol.go +++ b/go-packages/meep-sss-mgr/SssMgrBindingProtocol.go @@ -1,10 +1,8 @@ package sssmgr type SssMgrBindingProtocol interface { - init(tm *SssMgr) (err error) + init(tm *SssMgr, notify func(map[string]interface{})) (err error) send(p_ctx SssMgrBindingProtocolContext) (err error, resp interface{}) - //(p_op string, p_type string, p_to string, p_from string, p_ri string, p_rev []string, p_bodyMap map[string]map[string]interface{}) (err error, resp map[string]map[string]interface{}) - notify(p_resp string) (err error) uninit() (err error) } diff --git a/go-packages/meep-sss-mgr/http.go b/go-packages/meep-sss-mgr/http.go index cc6ee1d88..ce9fcc5f1 100644 --- a/go-packages/meep-sss-mgr/http.go +++ b/go-packages/meep-sss-mgr/http.go @@ -17,6 +17,7 @@ import ( ) type SssMgrHttp struct { + notify func(map[string]interface{}) } const ( @@ -29,19 +30,21 @@ func NewSssMgrHttp() (http_mgr *SssMgrHttp) { return new(SssMgrHttp) } -func (http_mgr *SssMgrHttp) init(tm *SssMgr) (err error) { +func (http_mgr *SssMgrHttp) init(tm *SssMgr, notify func(map[string]interface{})) (err error) { log.Info(">>> init") - // log.Info("Init: Starting OneM2M Notification server") - // go func() { - // http.HandleFunc("/", tm.handleRoot) - // err := http.ListenAndServe(":33122", nil) - // if err != nil { - // log.Error(err.Error()) - // return - // } - // log.Info("<<< Init: Terminating OneM2M Notification server") - // }() + http_mgr.notify = notify + + go func() { + log.Info("Init: Starting OneM2M Notification server") + http.HandleFunc("/", http_mgr.handleRoot) + err := http.ListenAndServe(":31122", nil) + if err != nil { + log.Error(err.Error()) + return + } + log.Info("<<< Init: Terminating OneM2M Notification server") + }() return nil } @@ -51,15 +54,49 @@ func (http_mgr *SssMgrHttp) handleRoot(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") - // get & validate query param values for sensorIdentifier + // Get URL u, _ := url.Parse(r.URL.String()) log.Info("url: ", u.RequestURI()) + if r.Method == "POST" { // Notification + // Extract body + bodyBytes, _ := ioutil.ReadAll(r.Body) + log.Info("subscriptionsPost: bodyBytes: ", string(bodyBytes)) + var body map[string]map[string]interface{} + err := json.Unmarshal(bodyBytes, &body) + if err != nil { + log.Error(err.Error()) + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprint(w, err.Error()) + return + } + log.Info("handleRoot: body: ", body) + //map[m2m:sgn:map[nev:map[net:3 rep:map[m2m:cnt:map[cbs:0 cni:0 ct:20250327T111057,824274 et:20300326T111032,133324 lt:20250327T111057,824274 mbs:10000 mni:10 pi:C7feaadbb0400 ri:cnt8465776292050557472 rn:test st:0 ty:3]]] sur:/laboai-acme-ic-cse/sub3916638126520907910]] + if _, ok := body["m2m:sgn"]; !ok { + err := errors.New("Only m2m:sgn is expected") + log.Error(err.Error()) + w.WriteHeader(http.StatusBadRequest) + fmt.Fprint(w, err.Error()) + return + } + // Call callback + m := body["m2m:sgn"] + log.Info("handleRoot: m: ", m) + if http_mgr.notify != nil { + http_mgr.notify(m) + } + } else { + log.Warn("handleRoot: Unsupported method", r.Method) + w.WriteHeader(http.StatusNotImplemented) + return + } + w.WriteHeader(http.StatusOK) } func (http_mgr *SssMgrHttp) uninit() (err error) { log.Info(">>> uninit") + return nil } @@ -130,12 +167,6 @@ func (http_mgr *SssMgrHttp) send(p_ctx SssMgrBindingProtocolContext) (err error, return nil, resp } - -func (http_mgr *SssMgrHttp) notify(p_resp string) (err error) { - log.Info(">>> notify") - return nil -} - func sendRequest(method string, url string, headers http.Header, body io.Reader, vars map[string]string, query map[string]string, code int) ([]byte, error) { //log.Debug(">>> sendRequest: url: ", url) //log.Debug(">>> sendRequest: headers: ", headers) diff --git a/go-packages/meep-sss-mgr/mqtt.go b/go-packages/meep-sss-mgr/mqtt.go index 04ca84151..9eec0dde7 100644 --- a/go-packages/meep-sss-mgr/mqtt.go +++ b/go-packages/meep-sss-mgr/mqtt.go @@ -13,14 +13,13 @@ import ( ) type SssMgrMqtt struct { - running bool - opts *mqtt.ClientOptions - client mqtt.Client - sent_topic string - onem2m_notify func(p_topic string, p_payload []byte) + running bool + opts *mqtt.ClientOptions + client mqtt.Client + sent_topic string } -var _onem2m_notify func(p_topic string, p_payload []byte) +var _notify func(map[string]interface{}) = nil var _sync_response *sync.WaitGroup = nil // Used to synchronize the response var _responses map[uint16]mqtt.Message @@ -28,8 +27,8 @@ var _responses map[uint16]mqtt.Message func onMessageReceived(client mqtt.Client, msg mqtt.Message) { go func() { log.Info("onMessageReceived: Received message: ", msg.Payload(), " on topic ", msg.Topic()) - // if _onem2m_notify != nil { - // _onem2m_notify(msg.Topic(), msg.Payload()) + // if _notify != nil { + // ... // } else { // log.Info("onMessageReceived: null pointer for the callbacl") // } @@ -39,11 +38,11 @@ func onMessageReceived(client mqtt.Client, msg mqtt.Message) { func onMessageReceivedReq(client mqtt.Client, msg mqtt.Message) { go func() { log.Info("onMessageReceivedReq: Received message: ", string(msg.Payload()), " on topic ", msg.Topic()) - if _onem2m_notify != nil { - _onem2m_notify(msg.Topic(), msg.Payload()) - } else { - log.Info("onMessageReceivedReq: null pointer for the callbacl") - } + // if _notify != nil { + // ... + // } else { + // log.Info("onMessageReceivedReq: null pointer for the callbacl") + // } }() } @@ -68,11 +67,13 @@ func NewSssMgrMqtt() (broker_mqtt *SssMgrMqtt) { return new(SssMgrMqtt) } -func (broker_mqtt *SssMgrMqtt) init(tm *SssMgr) (err error) { +func (broker_mqtt *SssMgrMqtt) init(tm *SssMgr, notify func(map[string]interface{})) (err error) { log.Info(">>> init") broker_mqtt.running = false + _notify = notify + broker_mqtt.opts = mqtt.NewClientOptions() broker_mqtt.opts.SetDefaultPublishHandler(onMessageReceived) broker_mqtt.opts.SetClientID("AdvantEDGE.meep-vis-traffic-mgr") @@ -109,11 +110,6 @@ func (broker_mqtt *SssMgrMqtt) init(tm *SssMgr) (err error) { } token.Wait() - _onem2m_notify = broker_mqtt.onem2m_notify - if _onem2m_notify == nil { - log.Error("init: _onem2m_notify is nil") - } - _sync_response = new(sync.WaitGroup) // Used to synchronize the response _responses = make(map[uint16]mqtt.Message, 0) @@ -248,9 +244,3 @@ func (broker_mqtt *SssMgrMqtt) send(p_ctx SssMgrBindingProtocolContext) (err err return nil, nil } - -func (broker_mqtt *SssMgrMqtt) notify(p_resp string) (err error) { - log.Info(">>> notify") - - return nil -} diff --git a/go-packages/meep-sss-mgr/onem2m-mgr.go b/go-packages/meep-sss-mgr/onem2m-mgr.go index d01cf6d20..ceebba77f 100644 --- a/go-packages/meep-sss-mgr/onem2m-mgr.go +++ b/go-packages/meep-sss-mgr/onem2m-mgr.go @@ -17,11 +17,8 @@ package sssmgr import ( - "bytes" "encoding/json" "errors" - "fmt" - "net/http" "reflect" "strconv" "strings" @@ -45,9 +42,9 @@ type SssMgr struct { mutex sync.Mutex wg sync.WaitGroup refreshTicker *time.Ticker - sss_discovery_notify func() - sss_status_notify func() - sss_data_notify func() + sss_discovery_notify func(map[string]interface{}) + sss_status_notify func(map[string]interface{}) + sss_data_notify func(map[string]interface{}) } type IotPlatformInfo struct { @@ -91,8 +88,10 @@ var profilingTimers map[string]time.Time var protocol SssMgrBindingProtocol +var subscriptionListPerSubId map[string]SensorDiscoveryInfo + // NewSssMgr - Creates and initializes a new SSS Traffic Manager -func NewSssMgr(name string, namespace string, bindingProtocol string, host string, port int, hostId string, cse_name string, sss_discovery_notify func(), sss_status_notify func(), sss_data_notify func()) (tm *SssMgr, err error) { +func NewSssMgr(name string, namespace string, bindingProtocol string, host string, port int, hostId string, cse_name string, sss_discovery_notify func(map[string]interface{}), sss_status_notify func(map[string]interface{}), sss_data_notify func(map[string]interface{})) (tm *SssMgr, err error) { if name == "" { err = errors.New("Missing connector name") return nil, err @@ -143,7 +142,7 @@ func NewSssMgr(name string, namespace string, bindingProtocol string, host strin return nil, err } - err = protocol.init(tm) + err = protocol.init(tm, tm.notify) if err != nil { log.Error(err.Error()) return nil, err @@ -174,7 +173,7 @@ func (tm *SssMgr) init() { sensorsMap = make(map[string]SensorDiscoveryInfo, 0) sensorsPerPlatformMap = make(map[string][]string, 0) tm.refreshTicker = nil - + subscriptionListPerSubId = make(map[string]SensorDiscoveryInfo, 0) } // DeleteSssMgr - @@ -185,6 +184,11 @@ func (tm *SssMgr) DeleteSssMgr() (err error) { protocol.uninit() protocol = nil } + + sensorsMap = nil + sensorsPerPlatformMap = nil + subscriptionListPerSubId = nil + return nil } @@ -684,56 +688,92 @@ func (tm *SssMgr) OneM2M_get(path string, iotPlatformId string) (sensorResp Sens return sensorResp, nil } -func (tm *SssMgr) oneM2M_subscribe(sensor SensorDiscoveryInfo, requestedIotPlatformId string, type_ string) (subscription string, err error) { - // FIXME FSCOM: requestedIotPlatformId should be useless - - // Build the headers - var headers = http.Header{} - headers["Accept"] = []string{headerAccept} - headers["X-M2M-Origin"] = []string{"C" + requestedIotPlatformId} // FIXME FSCOM How to get it - headers["X-M2M-RI"] = []string{uuid.New().String()} - headers["X-M2M-RVI"] = []string{"4"} - s := headerContentType + ";ty=23" - headers["Content-Type"] = []string{s} - // Build the url and the body - var url string +func (tm *SssMgr) OneM2M_subscribe(iotPlatformId string, path string) (subscription string, err error) { + if profiling { + profilingTimers["OneM2M_subscribe"] = time.Now() + } + + log.Info(">>> OneM2M_subscribe: path: ", path) + log.Info(">>> OneM2M_subscribe: iotPlatformId: ", iotPlatformId) + + if path == "" || iotPlatformId == "" { + err = errors.New("OneM2M_subscribe: Invalid parameters") + log.Error("OneM2M_subscribe: ", err.Error()) + return "", err + } + + tm.wg.Wait() + log.Info("OneM2M_subscribe: After Synchro") + + // 1. Get the list of the AE + // Build the context + var ctx = SssMgrBindingProtocolContext{ + host: registeredIotPlatformsMap[iotPlatformId].Address, + port: registeredIotPlatformsMap[iotPlatformId].Port, + name: registeredIotPlatformsMap[iotPlatformId].Name, + to: path, + from: registeredIotPlatformsMap[iotPlatformId].IotPlatformId, + op: 1, // SUBSCRIBE + ty: 23, + rqi: uuid.New().String(), + rvi: []string{"4"}, // FIXME FSCOM How to get it + code: 200, + } var bodyMap = map[string]map[string]interface{}{} bodyMap["m2m:sub"] = make(map[string]interface{}, 0) - net := make(map[string][4]int) - net["net"] = [4]int{1, 2, 3, 4} + net := make(map[string][]int) + net["net"] = []int{2, 3, 4} bodyMap["m2m:sub"]["enc"] = net - bodyMap["m2m:sub"]["nu"] = "" // FIXME The URI of the listener - bodyMap["m2m:sub"]["rn"] = sensor.SensorIdentifier - url = "http://" + registeredIotPlatformsMap[requestedIotPlatformId].Address + ":" + strconv.Itoa(int(registeredIotPlatformsMap[requestedIotPlatformId].Port)) + "/" + registeredIotPlatformsMap[requestedIotPlatformId].Name - log.Debug("oneM2M_subscribe: url=", url) - log.Debug("oneM2M_subscribe: bodyMap=", bodyMap) - body, err := json.Marshal(bodyMap) + bodyMap["m2m:sub"]["nu"] = []string{"http://172.29.10.52:31122/"} // FIXME FSCOM The URI of the listener + bodyMap["m2m:sub"]["rn"] = uuid.New().String() + ctx.body = bodyMap + + err, resp := protocol.send(ctx) if err != nil { - log.Error("oneM2M_subscribe: ", err.Error()) + log.Error("OneM2M_subscribe: ", err.Error()) return "", err } - log.Debug("oneM2M_subscribe: Request body: ", string(body)) - // Send the request - response, err := sendRequest("POST", url, headers, bytes.NewBuffer(body), nil, nil, 201) - if err != nil { - log.Error("oneM2M_subscribe: ", err.Error()) + log.Debug("OneM2M_subscribe: resp: ", resp) + log.Debug("OneM2M_subscribe: TypeOf(resp): ", reflect.TypeOf(resp)) + if _, ok := resp.(map[string]interface{}); !ok { + log.Error("OneM2M_create: Interface not available") + return "", err + } + + if _, ok := resp.(map[string]interface{})["m2m:sub"].(map[string]interface{})["ri"]; !ok { + err = errors.New("Subsciption identifier not present") + log.Error("OneM2M_subscribe: ", err.Error()) return "", err } - log.Debug("oneM2M_subscribe: response: ", string(response)) - var d map[string]map[string]interface{} - err = json.Unmarshal(response, &d) + subId := resp.(map[string]interface{})["m2m:sub"].(map[string]interface{})["ri"].(string) + log.Debug("OneM2M_subscribe: subId: ", subId) + + // Add additional entries + var v = SensorDiscoveryInfo{ + SensorIdentifier: subId, + SensorType: "SUB", + IotPlatformId: iotPlatformId, + } + v, err = tm.oneM2M_deserialize(v, resp.(map[string]interface{})) if err != nil { - log.Error("oneM2M_subscribe: ", err.Error()) + log.Error("OneM2M_subscribe: ", err.Error()) return "", err } - log.Debug("oneM2M_subscribe: d: ", d) + log.Debug("OneM2M_cOneM2M_subscribereate: sensvorResp: ", v) + + subscriptionListPerSubId[subId] = v + + //map[m2m:sub:map[ct:20250327T065259,502192 enc:map[net:[1 2 3 4]] et:20300326T065259,314830 lt:20250327T065259,502192 nct:1 nu:[http://172.29.10.52:31122] pi:C7feaadbb0400 ri:sub415201783625924167 rn:e31e93f4-8514-4c83-8854-364eee1ad305 ty:23]] - err = errors.New("oneM2M_subscribe: To be implemented") - return "", err /*nil*/ + if profiling { + now := time.Now() + log.Debug("OneM2M_subscribe: ", now.Sub(profilingTimers["OneM2M_subscribe"])) + } + + return subId, nil } func (tm *SssMgr) OneM2M_Delete(sensor SensorDiscoveryInfo) (err error) { - // FIXME FSCOM: requestedIotPlatformId should be useless if profiling { profilingTimers["OneM2M_Delete"] = time.Now() @@ -783,16 +823,134 @@ func (tm *SssMgr) OneM2M_Delete(sensor SensorDiscoveryInfo) (err error) { return nil } -func (tm *SssMgr) oneM2M_subscribe_discovery_event(requestedIotPlatformId string) (err error) { +func (tm *SssMgr) OneM2M_DeleteSub(subId string) (err error) { + + if profiling { + profilingTimers["OneM2M_DeleteSub"] = time.Now() + } + + log.Info(">>> OneM2M_DeleteSub: sensor=", subId) + + if subId == "" { + err = errors.New("subId fiels shall be set") + log.Error("OneM2M_DeleteSub: ", err.Error()) + return err + } + + if _, ok := subscriptionListPerSubId[subId]; !ok { + err = errors.New("Unkmown subscription identifier") + log.Error("OneM2M_DeleteSub: ", err.Error()) + return err + } + + tm.wg.Wait() + log.Info("OneM2M_DeleteSub: After Synchro") + + // Send it and get the result + var ctx = SssMgrBindingProtocolContext{ + host: registeredIotPlatformsMap[subscriptionListPerSubId[subId].IotPlatformId].Address, + port: registeredIotPlatformsMap[subscriptionListPerSubId[subId].IotPlatformId].Port, + name: registeredIotPlatformsMap[subscriptionListPerSubId[subId].IotPlatformId].Name, + to: subscriptionListPerSubId[subId].SensorIdentifier, + from: subscriptionListPerSubId[subId].IotPlatformId, + op: 4, // DELETE + ty: -1, + rqi: uuid.New().String(), + rvi: []string{"4"}, // FIXME FSCOM How to get it + code: 200, + } + err, _ = protocol.send(ctx) + if err != nil { + log.Error("OneM2M_DeleteSub: ", err.Error()) + return err + } + + delete(subscriptionListPerSubId, subId) + log.Info("OneM2M_DeleteSub: New subscriptionListPerSubId: ", subscriptionListPerSubId) + + if profiling { + now := time.Now() + log.Debug("OneM2M_DeleteSub: ", now.Sub(profilingTimers["OneM2M_DeleteSub"])) + } return nil } -func (tm *SssMgr) oneM2M_deserialize(sensor SensorDiscoveryInfo, response map[string]interface{}) (sensorResp SensorDiscoveryInfo, err error) { - sensorResp = sensor // Same data structure +func (tm *SssMgr) notify(sub map[string]interface{}) { + log.Debug(">>> notify: sub: ", sub) + + // Sanity checks + if _, ok := sub["nev"]; !ok { + log.Warn("notify: nev entry is missing") + return + } + if _, ok := sub["nev"].(map[string]interface{}); !ok { + log.Warn("notify: nev entry has unexpected type") + return + } + if _, ok := sub["nev"].(map[string]interface{}); !ok { + log.Warn("notify: nev entry has unexpected type") + return + } + if _, ok := sub["sur"]; !ok { + log.Warn("notify: sur entry is missing") + return + } + // Process subscription + s := strings.Split(sub["sur"].(string), "/") + log.Debug("notify: s: ", s) + log.Debug("notify: CSE-ID: ", s[1]) + log.Debug("notify: subURL: ", strings.Join(s[2:], "/")) + + rep := sub["nev"].(map[string]interface{}) + log.Debug("notify: rep: ", rep["rep"].(map[string]interface{})) + if _, ok := rep["rep"]; !ok { + log.Warn("notify: rep entry is missing") + return + } + if _, ok := rep["rep"].(map[string]interface{}); !ok { + log.Warn("notify: rep entry has unexpected type") + return + } + r := rep["rep"].(map[string]interface{}) + log.Debug("notify: r: ", r) + // FIXME FSCOM How to mange the 3 levels of subscriptions??? + if v, ok := r["m2m:ae"]; ok { // Discovery notification + log.Debug("notify: AE level") + if tm.sss_discovery_notify != nil { + go func() { + tm.sss_discovery_notify(v.(map[string]interface{})) + }() + } + return + } else if v, ok := r["m2m:cnt"]; ok { // Status notification + log.Debug("notify: CNT level") + if tm.sss_status_notify != nil { + go func() { + tm.sss_status_notify(v.(map[string]interface{})) + }() + } + return + } else if v, ok := r["m2m:cin"]; ok { // Data notification + if tm.sss_data_notify != nil { + go func() { + tm.sss_data_notify(v.(map[string]interface{})) + }() + } + log.Debug("notify: CIN level") + return + } else { + log.Debug("notify: Unexpected level") + return + } +} + +func (tm *SssMgr) oneM2M_deserialize(sensor SensorDiscoveryInfo, response map[string]interface{}) (sensorResp SensorDiscoveryInfo, err error) { log.Debug(">>> oneM2M_deserialize: response: ", response) + sensorResp = sensor // Same data structure + for i, m := range response { log.Debug("==> ", i, " value is ", m) if _, ok := m.(map[string]interface{}); !ok { @@ -864,19 +1022,35 @@ func (tm *SssMgr) oneM2M_deserialize(sensor SensorDiscoveryInfo, response map[st CharacteristicValue: strings.Join(item, ","), }) } else if item, ok := v.([]int64); ok { - log.Error("oneM2M_deserialize: Failed to convert list of int64 into string: ", item) + log.Warn("oneM2M_deserialize: Failed to convert list of int64 into string: ", item) + } else if item, ok := v.(map[string]interface{}); ok { + v, err := json.Marshal(item) + if err == nil { + sensorResp.SensorCharacteristicList = append( + sensorResp.SensorCharacteristicList, + SensorCharacteristic{ + CharacteristicName: k, + CharacteristicValue: string(v), + }) + } else { + log.Warn("oneM2M_deserialize: ", err.Error()) + } } else if item, ok := v.([]interface{}); ok { log.Debug("oneM2M_deserialize: Got []interface {} for ", k) log.Debug("oneM2M_deserialize: ValueOf ", reflect.ValueOf(item)) - s := SensorCharacteristic{ - CharacteristicName: k, + v, err := json.Marshal(item) + if err == nil { + sensorResp.SensorCharacteristicList = append( + sensorResp.SensorCharacteristicList, + SensorCharacteristic{ + CharacteristicName: k, + CharacteristicValue: string(v), + }) + } else { + log.Warn("oneM2M_deserialize: ", err.Error()) } - var buf bytes.Buffer - fmt.Fprintf(&buf, "%T", item) - s.CharacteristicValue = buf.String() - sensorResp.SensorCharacteristicList = append(sensorResp.SensorCharacteristicList, s) } else { - log.Error("oneM2M_deserialize: Failed to process: ", k) + log.Warn("oneM2M_deserialize: Failed to process: ", k) } } } // End of 'for' loop diff --git a/go-packages/meep-sss-mgr/onem2m-mgr_test.go b/go-packages/meep-sss-mgr/onem2m-mgr_test.go index 29632a58d..e3b43d099 100644 --- a/go-packages/meep-sss-mgr/onem2m-mgr_test.go +++ b/go-packages/meep-sss-mgr/onem2m-mgr_test.go @@ -20,6 +20,7 @@ import ( "fmt" "reflect" "testing" + "time" log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger" ) @@ -27,420 +28,479 @@ import ( const tmName = "meep-iot" const tmNamespace = "sandboxtest" -func TestNewSssMgr(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) +// func TestNewSssMgr(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) - // Invalid Connector - fmt.Println("Invalid SSS Asset Manager") - tm, err := NewSssMgr("", tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err == nil || tm != nil { - t.Fatalf("Service name not set") - } - tm, err = NewSssMgr(tmName, tmNamespace, "", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err == nil || tm != nil { - t.Fatalf("Binding protocol not set") - } - tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err == nil || tm != nil { - t.Fatalf("Host not set") - } - tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "", "laboai-acme-ic-cse", nil, nil, nil) - if err == nil || tm != nil { - t.Fatalf("Host id not set") - } - tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "", nil, nil, nil) - if err == nil || tm != nil { - t.Fatalf("CSE name not set") - } +// // Invalid Connector +// fmt.Println("Invalid SSS Asset Manager") +// tm, err := NewSssMgr("", tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err == nil || tm != nil { +// t.Fatalf("Service name not set") +// } +// tm, err = NewSssMgr(tmName, tmNamespace, "", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err == nil || tm != nil { +// t.Fatalf("Binding protocol not set") +// } +// tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err == nil || tm != nil { +// t.Fatalf("Host not set") +// } +// tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "", "laboai-acme-ic-cse", nil, nil, nil) +// if err == nil || tm != nil { +// t.Fatalf("Host id not set") +// } +// tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "", nil, nil, nil) +// if err == nil || tm != nil { +// t.Fatalf("CSE name not set") +// } - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err = NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil - fmt.Println("Create valid SSS Asset Manager") - tm, err = NewSssMgr(tmName, tmNamespace, "REST_HTTP", "172.29.10.56", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// fmt.Println("Create valid SSS Asset Manager") +// tm, err = NewSssMgr(tmName, tmNamespace, "REST_HTTP", "172.29.10.56", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } -func TestPopulateDevicesPerIotPlatformsHttp(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// func TestPopulateDevicesPerIotPlatformsHttp(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - err = tm.populateDevicesPerIotPlatforms() - if err != nil { - t.Fatalf(err.Error()) - } +// err = tm.populateDevicesPerIotPlatforms() +// if err != nil { +// t.Fatalf(err.Error()) +// } - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } -func TestSensorDiscoveryInfoAllHttp(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "", 0, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// func TestSensorDiscoveryInfoAllHttp(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "", 0, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - sensors, err := tm.SensorDiscoveryInfoAll() - if err != nil { - t.Fatalf(err.Error()) - } - fmt.Println("len=", len(sensors)) - fmt.Println("sensors", sensors) +// sensors, err := tm.SensorDiscoveryInfoAll() +// if err != nil { +// t.Fatalf(err.Error()) +// } +// fmt.Println("len=", len(sensors)) +// fmt.Println("sensors", sensors) - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } -func TestGetSensorHttp(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) +// func TestGetSensorHttp(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - sensors, err := tm.SensorDiscoveryInfoAll() - if err != nil { - t.Fatalf(err.Error()) - } +// sensors, err := tm.SensorDiscoveryInfoAll() +// if err != nil { +// t.Fatalf(err.Error()) +// } - for _, v := range sensors { - fmt.Println("v", v) - fmt.Println("TypeOf(v)", reflect.TypeOf(v)) +// for _, v := range sensors { +// fmt.Println("v", v) +// fmt.Println("TypeOf(v)", reflect.TypeOf(v)) - sensor, err := tm.GetSensor(v.SensorIdentifier) - if !validate_sensor_discovery_info(v, sensor) { - t.Fatalf(err.Error()) - } - } +// sensor, err := tm.GetSensor(v.SensorIdentifier) +// if !validate_sensor_discovery_info(v, sensor) { +// t.Fatalf(err.Error()) +// } +// } - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } -func TestOneM2M_createAEHttp(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) +// func TestOneM2M_createAEHttp(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - var sensor = SensorDiscoveryInfo{ - SensorIdentifier: "12345", - SensorType: "AE", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - new_sensor, err := tm.OneM2M_create(sensor, "") - if err != nil { - t.Fatalf("Failed to create new sensor") - } +// var sensor = SensorDiscoveryInfo{ +// SensorIdentifier: "12345", +// SensorType: "AE", +// SensorPosition: nil, +// IotPlatformId: "7feaadbb0400", +// } +// new_sensor, err := tm.OneM2M_create(sensor, "") +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } - // Verify content - if !validate_sensor_ae(sensor, new_sensor) { - t.Fatalf("Failed to validate AE content") - } +// // Verify content +// if !validate_sensor_ae(sensor, new_sensor) { +// t.Fatalf("Failed to validate AE content") +// } - _ = tm.OneM2M_Delete(new_sensor) +// _ = tm.OneM2M_Delete(new_sensor) - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } -func TestOneM2M_createAE_CNTHttp(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) +// func TestOneM2M_createAE_CNTHttp(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - var sensor_ae = SensorDiscoveryInfo{ - SensorIdentifier: "CMyAE", - SensorType: "AE", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "") - if err != nil { - t.Fatalf("Failed to create new AE sensor") - } +// var sensor_ae = SensorDiscoveryInfo{ +// SensorIdentifier: "CMyAE", +// SensorType: "AE", +// SensorPosition: nil, +// IotPlatformId: "7feaadbb0400", +// } +// new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "") +// if err != nil { +// t.Fatalf("Failed to create new AE sensor") +// } - // Verify content - if !validate_sensor_ae(sensor_ae, new_sensor_ae) { - t.Fatalf("Failed to validate AE content") - } +// // Verify content +// if !validate_sensor_ae(sensor_ae, new_sensor_ae) { +// t.Fatalf("Failed to validate AE content") +// } - var sensor_cnt = SensorDiscoveryInfo{ - SensorIdentifier: "CMyCNT", - SensorType: "CNT", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - // sensor_cnt.SensorCharacteristicList = make([]SensorCharacteristic, 1) - // sensor_cnt.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"} - sensorPath := new_sensor_ae.SensorIdentifier - new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath) - if err != nil { - t.Fatalf("Failed to create new CNT sensor") - } +// var sensor_cnt = SensorDiscoveryInfo{ +// SensorIdentifier: "CMyCNT", +// SensorType: "CNT", +// SensorPosition: nil, +// IotPlatformId: "7feaadbb0400", +// } +// // sensor_cnt.SensorCharacteristicList = make([]SensorCharacteristic, 1) +// // sensor_cnt.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"} +// sensorPath := new_sensor_ae.SensorIdentifier +// new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath) +// if err != nil { +// t.Fatalf("Failed to create new CNT sensor") +// } - // Verify content - if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) { - t.Fatalf("Failed to validate AE content") - } +// // Verify content +// if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) { +// t.Fatalf("Failed to validate AE content") +// } - err = tm.OneM2M_Delete(new_sensor_cnt) - if err != nil { - t.Fatalf("Failed to create new sensor") - } - err = tm.OneM2M_Delete(new_sensor_ae) - if err != nil { - t.Fatalf("Failed to create new sensor") - } +// err = tm.OneM2M_Delete(new_sensor_cnt) +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } +// err = tm.OneM2M_Delete(new_sensor_ae) +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } -func TestOneM2M_createAE_CNT_CNIHttp(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) +// func TestOneM2M_createAE_CNT_CNIHttp(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - var sensor_ae = SensorDiscoveryInfo{ - SensorIdentifier: "CMyAE", - SensorType: "AE", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "") - if err != nil { - t.Fatalf("Failed to create new AE sensor") - } +// var sensor_ae = SensorDiscoveryInfo{ +// SensorIdentifier: "CMyAE", +// SensorType: "AE", +// SensorPosition: nil, +// IotPlatformId: "7feaadbb0400", +// } +// new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "") +// if err != nil { +// t.Fatalf("Failed to create new AE sensor") +// } - // Verify content - if !validate_sensor_ae(sensor_ae, new_sensor_ae) { - t.Fatalf("Failed to validate AE content") - } +// // Verify content +// if !validate_sensor_ae(sensor_ae, new_sensor_ae) { +// t.Fatalf("Failed to validate AE content") +// } - var sensor_cnt = SensorDiscoveryInfo{ - SensorIdentifier: "CMyCNT", - SensorType: "CNT", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - sensorPath := new_sensor_ae.SensorIdentifier - new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath) - if err != nil { - t.Fatalf("Failed to create new CNT sensor") - } +// var sensor_cnt = SensorDiscoveryInfo{ +// SensorIdentifier: "CMyCNT", +// SensorType: "CNT", +// SensorPosition: nil, +// IotPlatformId: "7feaadbb0400", +// } +// sensorPath := new_sensor_ae.SensorIdentifier +// new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath) +// if err != nil { +// t.Fatalf("Failed to create new CNT sensor") +// } - // Verify content - if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) { - t.Fatalf("Failed to validate CNT content") - } +// // Verify content +// if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) { +// t.Fatalf("Failed to validate CNT content") +// } - var sensor_cin = SensorDiscoveryInfo{ - SensorIdentifier: "CMyCNI", - SensorType: "CIN", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - sensor_cin.SensorCharacteristicList = make([]SensorCharacteristic, 1) - sensor_cin.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"} - sensorPath = new_sensor_cnt.SensorIdentifier - new_sensor_cin, err := tm.OneM2M_create(sensor_cin, sensorPath) - if err != nil { - t.Fatalf("Failed to create new sensor") - } +// var sensor_cin = SensorDiscoveryInfo{ +// SensorIdentifier: "CMyCNI", +// SensorType: "CIN", +// SensorPosition: nil, +// IotPlatformId: "7feaadbb0400", +// } +// sensor_cin.SensorCharacteristicList = make([]SensorCharacteristic, 1) +// sensor_cin.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"} +// sensorPath = new_sensor_cnt.SensorIdentifier +// new_sensor_cin, err := tm.OneM2M_create(sensor_cin, sensorPath) +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } - // Verify content - if !validate_sensor_cin(sensor_cin, new_sensor_cin) { - t.Fatalf("Failed to validate CIN content") - } +// // Verify content +// if !validate_sensor_cin(sensor_cin, new_sensor_cin) { +// t.Fatalf("Failed to validate CIN content") +// } - err = tm.OneM2M_Delete(new_sensor_cin) - if err != nil { - t.Fatalf("Failed to create new sensor") - } - err = tm.OneM2M_Delete(new_sensor_cnt) - if err != nil { - t.Fatalf("Failed to create new sensor") - } - err = tm.OneM2M_Delete(new_sensor_ae) - if err != nil { - t.Fatalf("Failed to create new sensor") - } +// err = tm.OneM2M_Delete(new_sensor_cin) +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } +// err = tm.OneM2M_Delete(new_sensor_cnt) +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } +// err = tm.OneM2M_Delete(new_sensor_ae) +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } -func TestOneM2M_deleteHttp(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) +// func TestOneM2M_deleteHttp(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - var new_sensor = SensorDiscoveryInfo{ - SensorIdentifier: "12345", - SensorType: "AE", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - sensor, err := oneM2M_create(tm, new_sensor, "") - if err != nil { - t.Fatalf("Failed to create new sensor: " + err.Error()) - } +// var new_sensor = SensorDiscoveryInfo{ +// SensorIdentifier: "12345", +// SensorType: "AE", +// SensorPosition: nil, +// IotPlatformId: "7feaadbb0400", +// } +// sensor, err := oneM2M_create(tm, new_sensor, "") +// if err != nil { +// t.Fatalf("Failed to create new sensor: " + err.Error()) +// } - err = tm.OneM2M_Delete(sensor) - if err != nil { - t.Fatalf("Failed to create new sensor: " + err.Error()) - } +// err = tm.OneM2M_Delete(sensor) +// if err != nil { +// t.Fatalf("Failed to create new sensor: " + err.Error()) +// } - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } + +// func TestOneM2M_getHttp(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) + +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } + +// sensors, received_sensors, err := oneM2M_createAE_CNT_CIN(tm) +// if err != nil { +// t.Fatalf("Failed to create sensors") +// } + +// // Verify content +// if len(sensors) != 3 || len(received_sensors) != 3 { +// t.Fatalf("Failed to create sensors") +// } + +// // Get one sensor +// sensorResp, err := tm.OneM2M_get(received_sensors["CNT"].SensorIdentifier, received_sensors["CNT"].IotPlatformId) +// if err != nil { +// t.Fatalf("Failed to discover CNT sensor") +// } +// // Verify content +// if !validate_sensor_cnt(received_sensors["CNT"], sensorResp) { +// t.Fatalf("Failed to validate CNT content") +// } + +// sensorResp, err = tm.OneM2M_get(received_sensors["CIN"].SensorIdentifier, received_sensors["CIN"].IotPlatformId) +// if err != nil { +// t.Fatalf("Failed to discover CNT sensor") +// } +// // Verify content +// if !validate_sensor_cin(received_sensors["CIN"], sensorResp) { +// t.Fatalf("Failed to validate CIN content") +// } -func TestOneM2M_getHttp(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) +// _ = tm.OneM2M_Delete(received_sensors["CIN"]) +// _ = tm.OneM2M_Delete(received_sensors["CNT"]) +// _ = tm.OneM2M_Delete(received_sensors["AE"]) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } - sensors, received_sensors, err := oneM2M_createAE_CNT_CIN(tm) - if err != nil { - t.Fatalf("Failed to create sensors") - } +// func TestOneM2M_discoveryHttp(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) - // Verify content - if len(sensors) != 3 || len(received_sensors) != 3 { - t.Fatalf("Failed to create sensors") - } +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - // Get one sensor - sensorResp, err := tm.OneM2M_get(received_sensors["CNT"].SensorIdentifier, received_sensors["CNT"].IotPlatformId) - if err != nil { - t.Fatalf("Failed to discover CNT sensor") - } - // Verify content - if !validate_sensor_cnt(received_sensors["CNT"], sensorResp) { - t.Fatalf("Failed to validate CNT content") - } +// _, received_sensors, err := oneM2M_createAE_CNT_CIN(tm) +// if err != nil { +// t.Fatalf("Failed to create sensors") +// } - sensorResp, err = tm.OneM2M_get(received_sensors["CIN"].SensorIdentifier, received_sensors["CIN"].IotPlatformId) - if err != nil { - t.Fatalf("Failed to discover CNT sensor") - } - // Verify content - if !validate_sensor_cin(received_sensors["CIN"], sensorResp) { - t.Fatalf("Failed to validate CIN content") - } +// // Verify content +// if len(received_sensors) != 3 { +// t.Fatalf("Failed to create sensors") +// } - _ = tm.OneM2M_Delete(received_sensors["CIN"]) - _ = tm.OneM2M_Delete(received_sensors["CNT"]) - _ = tm.OneM2M_Delete(received_sensors["AE"]) +// // Discover CNTs +// sensorList, err := tm.OneM2M_discovery(received_sensors["CNT"].SensorType, received_sensors["CNT"].IotPlatformId) +// if err != nil { +// t.Fatalf("Failed to discover CNT sensor") +// } +// if len(sensorList) != 1 { +// t.Fatalf("Wrong discover result") +// } +// // Verify content +// if !validate_sensor_cnt(received_sensors["CNT"], sensorList[0]) { +// t.Fatalf("Failed to validate CNT content") +// } - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Discover AEs +// sensorList, err = tm.OneM2M_discovery(received_sensors["AE"].SensorType, received_sensors["AE"].IotPlatformId) +// if err != nil { +// t.Fatalf("Failed to discover AE sensor") +// } +// if len(sensorList) != 1 { +// t.Fatalf("Wrong discover result") +// } +// // Verify content +// if !validate_sensor_ae(received_sensors["AE"], sensorList[0]) { +// t.Fatalf("Failed to validate AE content") +// } + +// _ = tm.OneM2M_Delete(received_sensors["CIN"]) +// _ = tm.OneM2M_Delete(received_sensors["CNT"]) +// _ = tm.OneM2M_Delete(received_sensors["AE"]) + +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } -func TestOneM2M_discoveryHttp(t *testing.T) { +func TestOneM2M_subscribeHttp(t *testing.T) { fmt.Println("--- ", t.Name()) log.MeepTextLogInit(t.Name()) // Valid Connector fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) + tm, err := NewSssMgr(tmName, tmNamespace, "REST_HTTP", "lab-oai.etsi.org", 31110, "7feaadbb0400", "laboai-acme-ic-cse", discoveryNotify, statusNotify, dataNotify) if err != nil || tm == nil { t.Fatalf("Failed to create SSS Asset Manager") } @@ -450,36 +510,32 @@ func TestOneM2M_discoveryHttp(t *testing.T) { t.Fatalf("Failed to create sensors") } - // Verify content - if len(received_sensors) != 3 { - t.Fatalf("Failed to create sensors") - } - - // Discover CNTs - sensorList, err := tm.OneM2M_discovery(received_sensors["CNT"].SensorType, received_sensors["CNT"].IotPlatformId) + subscriptionMap := make(map[string]interface{}) + subId, err := tm.OneM2M_subscribe(received_sensors["AE"].IotPlatformId, received_sensors["AE"].SensorIdentifier) if err != nil { - t.Fatalf("Failed to discover CNT sensor") - } - if len(sensorList) != 1 { - t.Fatalf("Wrong discover result") - } - // Verify content - if !validate_sensor_cnt(received_sensors["CNT"], sensorList[0]) { - t.Fatalf("Failed to validate CNT content") + t.Fatalf("Failed to subscribe") } + fmt.Println("subId=" + subId) + subscriptionMap[subId] = received_sensors["AE"] - // Discover AEs - sensorList, err = tm.OneM2M_discovery(received_sensors["AE"].SensorType, received_sensors["AE"].IotPlatformId) + subId, err = tm.OneM2M_subscribe(received_sensors["CNT"].IotPlatformId, received_sensors["CNT"].SensorIdentifier) if err != nil { - t.Fatalf("Failed to discover AE sensor") - } - if len(sensorList) != 1 { - t.Fatalf("Wrong discover result") - } - // Verify content - if !validate_sensor_ae(received_sensors["AE"], sensorList[0]) { - t.Fatalf("Failed to validate AE content") + t.Fatalf("Failed to subscribe") } + fmt.Println("subId=" + subId) + subscriptionMap[subId] = received_sensors["CNT"] + + fmt.Println("len(subscriptionMap)=" + fmt.Sprint(len(subscriptionMap))) + + fmt.Println("You have 120 seconds to trigger subscriptions") + time.Sleep(time.Duration(120) * time.Second) + + for k := range subscriptionMap { + err = tm.OneM2M_DeleteSub(k) + if err != nil { + t.Fatalf("Failed to cancel subscription") + } + } // End of 'for' statement _ = tm.OneM2M_Delete(received_sensors["CIN"]) _ = tm.OneM2M_Delete(received_sensors["CNT"]) @@ -493,423 +549,423 @@ func TestOneM2M_discoveryHttp(t *testing.T) { tm = nil } -func TestPopulateDevicesPerIotPlatformsMqtt(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } - err = tm.populateDevicesPerIotPlatforms() - if err != nil { - t.Fatalf(err.Error()) - } - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// func TestPopulateDevicesPerIotPlatformsMqtt(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } +// err = tm.populateDevicesPerIotPlatforms() +// if err != nil { +// t.Fatalf(err.Error()) +// } +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } -func TestSensorDiscoveryInfoAllMqtt(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) +// func TestSensorDiscoveryInfoAllMqtt(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - err = tm.populateDevicesPerIotPlatforms() - if err != nil { - t.Fatalf(err.Error()) - } +// err = tm.populateDevicesPerIotPlatforms() +// if err != nil { +// t.Fatalf(err.Error()) +// } - sensors, err := tm.SensorDiscoveryInfoAll() - if err != nil { - t.Fatalf(err.Error()) - } - fmt.Println("sensors: ", sensors) +// sensors, err := tm.SensorDiscoveryInfoAll() +// if err != nil { +// t.Fatalf(err.Error()) +// } +// fmt.Println("sensors: ", sensors) - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// } -func TestGetSensorMqtt(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) +// func TestGetSensorMqtt(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - sensors, err := tm.SensorDiscoveryInfoAll() - if err != nil { - t.Fatalf(err.Error()) - } +// sensors, err := tm.SensorDiscoveryInfoAll() +// if err != nil { +// t.Fatalf(err.Error()) +// } - for _, v := range sensors { - fmt.Println("v", v) - fmt.Println("TypeOf(v)", reflect.TypeOf(v)) +// for _, v := range sensors { +// fmt.Println("v", v) +// fmt.Println("TypeOf(v)", reflect.TypeOf(v)) - sensor, err := tm.GetSensor(v.SensorIdentifier) - if !validate_sensor_discovery_info(v, sensor) { - t.Fatalf(err.Error()) - } - } +// sensor, err := tm.GetSensor(v.SensorIdentifier) +// if !validate_sensor_discovery_info(v, sensor) { +// t.Fatalf(err.Error()) +// } +// } - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } -func TestOneM2M_createAEMQTT(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) +// func TestOneM2M_createAEMQTT(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - var sensor = SensorDiscoveryInfo{ - SensorIdentifier: "12345", - SensorType: "AE", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - new_sensor, err := tm.OneM2M_create(sensor, "") - if err != nil { - t.Fatalf("Failed to create new sensor") - } +// var sensor = SensorDiscoveryInfo{ +// SensorIdentifier: "12345", +// SensorType: "AE", +// SensorPosition: nil, +// IotPlatformId: "7feaadbb0400", +// } +// new_sensor, err := tm.OneM2M_create(sensor, "") +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } - // Verify content - if !validate_sensor_ae(sensor, new_sensor) { - t.Fatalf("Failed to validate AE content") - } +// // Verify content +// if !validate_sensor_ae(sensor, new_sensor) { +// t.Fatalf("Failed to validate AE content") +// } - _ = tm.OneM2M_Delete(new_sensor) +// _ = tm.OneM2M_Delete(new_sensor) - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } -func TestOneM2M_createAE_CNTMQTT(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) +// func TestOneM2M_createAE_CNTMQTT(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - var sensor_ae = SensorDiscoveryInfo{ - SensorIdentifier: "CMyAE", - SensorType: "AE", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "") - if err != nil { - t.Fatalf("Failed to create new AE sensor") - } +// var sensor_ae = SensorDiscoveryInfo{ +// SensorIdentifier: "CMyAE", +// SensorType: "AE", +// SensorPosition: nil, +// IotPlatformId: "7feaadbb0400", +// } +// new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "") +// if err != nil { +// t.Fatalf("Failed to create new AE sensor") +// } - // Verify content - if !validate_sensor_ae(sensor_ae, new_sensor_ae) { - t.Fatalf("Failed to validate AE content") - } +// // Verify content +// if !validate_sensor_ae(sensor_ae, new_sensor_ae) { +// t.Fatalf("Failed to validate AE content") +// } - var sensor_cnt = SensorDiscoveryInfo{ - SensorIdentifier: "CMyCNT", - SensorType: "CNT", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - // sensor_cnt.SensorCharacteristicList = make([]SensorCharacteristic, 1) - // sensor_cnt.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"} - sensorPath := new_sensor_ae.SensorIdentifier - new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath) - if err != nil { - t.Fatalf("Failed to create new sensor") - } +// var sensor_cnt = SensorDiscoveryInfo{ +// SensorIdentifier: "CMyCNT", +// SensorType: "CNT", +// SensorPosition: nil, +// IotPlatformId: "7feaadbb0400", +// } +// // sensor_cnt.SensorCharacteristicList = make([]SensorCharacteristic, 1) +// // sensor_cnt.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"} +// sensorPath := new_sensor_ae.SensorIdentifier +// new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath) +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } - // Verify content - if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) { - t.Fatalf("Failed to validate CNT content") - } +// // Verify content +// if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) { +// t.Fatalf("Failed to validate CNT content") +// } - err = tm.OneM2M_Delete(new_sensor_cnt) - if err != nil { - t.Fatalf("Failed to create new sensor") - } - err = tm.OneM2M_Delete(new_sensor_ae) - if err != nil { - t.Fatalf("Failed to create new sensor") - } +// err = tm.OneM2M_Delete(new_sensor_cnt) +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } +// err = tm.OneM2M_Delete(new_sensor_ae) +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } -func TestOneM2M_createAE_CNT_CNIMQTT(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) +// func TestOneM2M_createAE_CNT_CNIMQTT(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - var sensor_ae = SensorDiscoveryInfo{ - SensorIdentifier: "CMyAE", - SensorType: "AE", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "") - if err != nil { - t.Fatalf("Failed to create new AE sensor") - } +// var sensor_ae = SensorDiscoveryInfo{ +// SensorIdentifier: "CMyAE", +// SensorType: "AE", +// SensorPosition: nil, +// IotPlatformId: "7feaadbb0400", +// } +// new_sensor_ae, err := tm.OneM2M_create(sensor_ae, "") +// if err != nil { +// t.Fatalf("Failed to create new AE sensor") +// } - // Verify content - if !validate_sensor_ae(sensor_ae, new_sensor_ae) { - t.Fatalf("Failed to validate AE content") - } +// // Verify content +// if !validate_sensor_ae(sensor_ae, new_sensor_ae) { +// t.Fatalf("Failed to validate AE content") +// } - var sensor_cnt = SensorDiscoveryInfo{ - SensorIdentifier: "CMyCNT", - SensorType: "CNT", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - sensorPath := new_sensor_ae.SensorIdentifier - new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath) - if err != nil { - t.Fatalf("Failed to create new sensor") - } +// var sensor_cnt = SensorDiscoveryInfo{ +// SensorIdentifier: "CMyCNT", +// SensorType: "CNT", +// SensorPosition: nil, +// IotPlatformId: "7feaadbb0400", +// } +// sensorPath := new_sensor_ae.SensorIdentifier +// new_sensor_cnt, err := tm.OneM2M_create(sensor_cnt, sensorPath) +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } - // Verify content - if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) { - t.Fatalf("Failed to validate CNT content") - } +// // Verify content +// if !validate_sensor_cnt(sensor_cnt, new_sensor_cnt) { +// t.Fatalf("Failed to validate CNT content") +// } - var sensor_cin = SensorDiscoveryInfo{ - SensorIdentifier: "CMyCNI", - SensorType: "CIN", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - sensor_cin.SensorCharacteristicList = make([]SensorCharacteristic, 1) - sensor_cin.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"} - sensorPath = new_sensor_cnt.SensorIdentifier - new_sensor_cin, err := tm.OneM2M_create(sensor_cin, sensorPath) - if err != nil { - t.Fatalf("Failed to create new sensor") - } - if new_sensor_cin.SensorType != sensor_cin.SensorType { - t.Fatalf("received_sensor.SensorType != SensorType") - } - if new_sensor_cin.IotPlatformId != sensor_cin.IotPlatformId { - t.Fatalf("received_sensor.IotPlatformId != IotPlatformId") - } - if len(new_sensor_cin.SensorCharacteristicList) == 0 { - t.Fatalf("received_sensor.SensorCharacteristicList shall not be empty") - } +// var sensor_cin = SensorDiscoveryInfo{ +// SensorIdentifier: "CMyCNI", +// SensorType: "CIN", +// SensorPosition: nil, +// IotPlatformId: "7feaadbb0400", +// } +// sensor_cin.SensorCharacteristicList = make([]SensorCharacteristic, 1) +// sensor_cin.SensorCharacteristicList[0] = SensorCharacteristic{CharacteristicName: "con", CharacteristicValue: "OFF"} +// sensorPath = new_sensor_cnt.SensorIdentifier +// new_sensor_cin, err := tm.OneM2M_create(sensor_cin, sensorPath) +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } +// if new_sensor_cin.SensorType != sensor_cin.SensorType { +// t.Fatalf("received_sensor.SensorType != SensorType") +// } +// if new_sensor_cin.IotPlatformId != sensor_cin.IotPlatformId { +// t.Fatalf("received_sensor.IotPlatformId != IotPlatformId") +// } +// if len(new_sensor_cin.SensorCharacteristicList) == 0 { +// t.Fatalf("received_sensor.SensorCharacteristicList shall not be empty") +// } - err = tm.OneM2M_Delete(new_sensor_cin) - if err != nil { - t.Fatalf("Failed to create new sensor") - } - err = tm.OneM2M_Delete(new_sensor_cnt) - if err != nil { - t.Fatalf("Failed to create new sensor") - } - err = tm.OneM2M_Delete(new_sensor_ae) - if err != nil { - t.Fatalf("Failed to create new sensor") - } +// err = tm.OneM2M_Delete(new_sensor_cin) +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } +// err = tm.OneM2M_Delete(new_sensor_cnt) +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } +// err = tm.OneM2M_Delete(new_sensor_ae) +// if err != nil { +// t.Fatalf("Failed to create new sensor") +// } - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } -func TestOneM2M_deleteMQTT(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) +// func TestOneM2M_deleteMQTT(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - var new_sensor = SensorDiscoveryInfo{ - SensorIdentifier: "12345", - SensorType: "AE", - SensorPosition: nil, - IotPlatformId: "7feaadbb0400", - } - sensor, err := oneM2M_create(tm, new_sensor, "") - if err != nil { - t.Fatalf("Failed to create new sensor: " + err.Error()) - } +// var new_sensor = SensorDiscoveryInfo{ +// SensorIdentifier: "12345", +// SensorType: "AE", +// SensorPosition: nil, +// IotPlatformId: "7feaadbb0400", +// } +// sensor, err := oneM2M_create(tm, new_sensor, "") +// if err != nil { +// t.Fatalf("Failed to create new sensor: " + err.Error()) +// } - err = tm.OneM2M_Delete(sensor) - if err != nil { - t.Fatalf("Failed to create new sensor: " + err.Error()) - } +// err = tm.OneM2M_Delete(sensor) +// if err != nil { +// t.Fatalf("Failed to create new sensor: " + err.Error()) +// } - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } -func TestOneM2M_getMQTT(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) +// func TestOneM2M_getMQTT(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - sensors, received_sensors, err := oneM2M_createAE_CNT_CIN(tm) - if err != nil { - t.Fatalf("Failed to create sensors") - } +// sensors, received_sensors, err := oneM2M_createAE_CNT_CIN(tm) +// if err != nil { +// t.Fatalf("Failed to create sensors") +// } - // Verify content - if len(sensors) != 3 || len(received_sensors) != 3 { - t.Fatalf("Failed to create sensors") - } +// // Verify content +// if len(sensors) != 3 || len(received_sensors) != 3 { +// t.Fatalf("Failed to create sensors") +// } - // Get one sensor - sensorResp, err := tm.OneM2M_get(received_sensors["CNT"].SensorIdentifier, received_sensors["CNT"].IotPlatformId) - if err != nil { - t.Fatalf("Failed to discover CNT sensor") - } - // Verify content - if !validate_sensor_cnt(received_sensors["CNT"], sensorResp) { - t.Fatalf("Failed to validate CNT content") - } +// // Get one sensor +// sensorResp, err := tm.OneM2M_get(received_sensors["CNT"].SensorIdentifier, received_sensors["CNT"].IotPlatformId) +// if err != nil { +// t.Fatalf("Failed to discover CNT sensor") +// } +// // Verify content +// if !validate_sensor_cnt(received_sensors["CNT"], sensorResp) { +// t.Fatalf("Failed to validate CNT content") +// } - sensorResp, err = tm.OneM2M_get(received_sensors["CIN"].SensorIdentifier, received_sensors["CIN"].IotPlatformId) - if err != nil { - t.Fatalf("Failed to discover CNT sensor") - } - // Verify content - if !validate_sensor_cin(received_sensors["CIN"], sensorResp) { - t.Fatalf("Failed to validate CIN content") - } +// sensorResp, err = tm.OneM2M_get(received_sensors["CIN"].SensorIdentifier, received_sensors["CIN"].IotPlatformId) +// if err != nil { +// t.Fatalf("Failed to discover CNT sensor") +// } +// // Verify content +// if !validate_sensor_cin(received_sensors["CIN"], sensorResp) { +// t.Fatalf("Failed to validate CIN content") +// } - _ = tm.OneM2M_Delete(received_sensors["CIN"]) - _ = tm.OneM2M_Delete(received_sensors["CNT"]) - _ = tm.OneM2M_Delete(received_sensors["AE"]) +// _ = tm.OneM2M_Delete(received_sensors["CIN"]) +// _ = tm.OneM2M_Delete(received_sensors["CNT"]) +// _ = tm.OneM2M_Delete(received_sensors["AE"]) - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } -func TestOneM2M_discoveryMQTT(t *testing.T) { - fmt.Println("--- ", t.Name()) - log.MeepTextLogInit(t.Name()) +// func TestOneM2M_discoveryMQTT(t *testing.T) { +// fmt.Println("--- ", t.Name()) +// log.MeepTextLogInit(t.Name()) - // Valid Connector - fmt.Println("Create valid SSS Asset Manager") - tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) - if err != nil || tm == nil { - t.Fatalf("Failed to create SSS Asset Manager") - } +// // Valid Connector +// fmt.Println("Create valid SSS Asset Manager") +// tm, err := NewSssMgr(tmName, tmNamespace, "MQTT", "172.29.10.56", 1883, "7feaadbb0400", "laboai-acme-ic-cse", nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } - _, received_sensors, err := oneM2M_createAE_CNT_CIN(tm) - if err != nil { - t.Fatalf("Failed to create sensors") - } +// _, received_sensors, err := oneM2M_createAE_CNT_CIN(tm) +// if err != nil { +// t.Fatalf("Failed to create sensors") +// } - // Verify content - if len(received_sensors) != 3 { - t.Fatalf("Failed to create sensors") - } +// // Verify content +// if len(received_sensors) != 3 { +// t.Fatalf("Failed to create sensors") +// } - // Discover CNTs - sensorList, err := tm.OneM2M_discovery(received_sensors["CNT"].SensorType, received_sensors["CNT"].IotPlatformId) - if err != nil { - t.Fatalf("Failed to discover CNT sensor") - } - if len(sensorList) != 1 { - t.Fatalf("Wrong discover result") - } - // Verify content - if !validate_sensor_cnt(received_sensors["CNT"], sensorList[0]) { - t.Fatalf("Failed to validate CNT content") - } +// // Discover CNTs +// sensorList, err := tm.OneM2M_discovery(received_sensors["CNT"].SensorType, received_sensors["CNT"].IotPlatformId) +// if err != nil { +// t.Fatalf("Failed to discover CNT sensor") +// } +// if len(sensorList) != 1 { +// t.Fatalf("Wrong discover result") +// } +// // Verify content +// if !validate_sensor_cnt(received_sensors["CNT"], sensorList[0]) { +// t.Fatalf("Failed to validate CNT content") +// } - // Discover AEs - sensorList, err = tm.OneM2M_discovery(received_sensors["AE"].SensorType, received_sensors["AE"].IotPlatformId) - if err != nil { - t.Fatalf("Failed to discover AE sensor") - } - if len(sensorList) != 1 { - t.Fatalf("Wrong discover result") - } - // Verify content - if !validate_sensor_ae(received_sensors["AE"], sensorList[0]) { - t.Fatalf("Failed to validate AE content") - } +// // Discover AEs +// sensorList, err = tm.OneM2M_discovery(received_sensors["AE"].SensorType, received_sensors["AE"].IotPlatformId) +// if err != nil { +// t.Fatalf("Failed to discover AE sensor") +// } +// if len(sensorList) != 1 { +// t.Fatalf("Wrong discover result") +// } +// // Verify content +// if !validate_sensor_ae(received_sensors["AE"], sensorList[0]) { +// t.Fatalf("Failed to validate AE content") +// } - _ = tm.OneM2M_Delete(received_sensors["CIN"]) - _ = tm.OneM2M_Delete(received_sensors["CNT"]) - _ = tm.OneM2M_Delete(received_sensors["AE"]) +// _ = tm.OneM2M_Delete(received_sensors["CIN"]) +// _ = tm.OneM2M_Delete(received_sensors["CNT"]) +// _ = tm.OneM2M_Delete(received_sensors["AE"]) - // Cleanup - err = tm.DeleteSssMgr() - if err != nil { - t.Fatalf("Failed to cleanup SSS Asset Manager") - } - tm = nil -} +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } +// tm = nil +// } // func TestVaidateOneM2MNotificationServer(t *testing.T) { // fmt.Println("--- ", t.Name()) @@ -923,7 +979,7 @@ func TestOneM2M_discoveryMQTT(t *testing.T) { // } // tm.init() -// fmt.Println("Waiting for 2 minutes to do curl request: curl -v http://mec-platform.etsi.org:33122/sbxykqjr17/mep1/sens/v1 ") +// fmt.Println("Waiting for 2 minutes to do curl request: curl -v http://mec-platform.etsi.org:31122/sbxykqjr17/mep1/sens/v1 ") // // Cleanup // err = tm.DeleteSssMgr() @@ -1150,3 +1206,18 @@ func validate_sensor_cin(expected_sensor SensorDiscoveryInfo, received_sensor Se return true } + +func discoveryNotify(map[string]interface{}) { + log.Debug(">>> discoveryNotify") + +} + +func statusNotify(map[string]interface{}) { + log.Debug(">>> statusNotify") + +} + +func dataNotify(map[string]interface{}) { + log.Debug(">>> dataNotify") + +} -- GitLab