diff --git a/docs/meep-sss/SensorStatusSubscriptionApi.md b/docs/meep-sss/SensorStatusSubscriptionApi.md index 8802daea1b36ad63fe5988b14da11df17532dfc8..86c8ea73df43d43abfc4bb5f82b708c270b0e62f 100644 --- a/docs/meep-sss/SensorStatusSubscriptionApi.md +++ b/docs/meep-sss/SensorStatusSubscriptionApi.md @@ -4,13 +4,13 @@ All URIs are relative to *https://localhost/sandboxname/sens/v1* Method | HTTP request | Description ------------- | ------------- | ------------- -[**SensorSatusIndividualSubscriptionGET**](SensorStatusSubscriptionApi.md#SensorSatusIndividualSubscriptionGET) | **Get** /subscriptions/sensor_status/{subscriptionId} | The GET method is used to retrieve information about this subscription +[**SensorStatusIndividualSubscriptionGET**](SensorStatusSubscriptionApi.md#SensorStatusIndividualSubscriptionGET) | **Get** /subscriptions/sensor_status/{subscriptionId} | The GET method is used to retrieve information about this subscription [**SensorStatusIndividualSubscriptionGET**](SensorStatusSubscriptionApi.md#SensorStatusIndividualSubscriptionGET) | **Get** /subscriptions/sensor_status | The GET method is used to request information about the subscriptions related to sensor status for this requestor [**SensorStatusSubscriptionDELETE**](SensorStatusSubscriptionApi.md#SensorStatusSubscriptionDELETE) | **Delete** /subscriptions/sensor_status/{subscriptionId} | The DELETE method is used to cancel the existing subscription [**SensorStatusSubscriptionPUT**](SensorStatusSubscriptionApi.md#SensorStatusSubscriptionPUT) | **Put** /subscriptions/sensor_status/{subscriptionId} | The PUT method is used to update the existing subscription -# **SensorSatusIndividualSubscriptionGET** -> []SensorStatusSubscription SensorSatusIndividualSubscriptionGET(ctx, subscriptionId) +# **SensorStatusIndividualSubscriptionGET** +> []SensorStatusSubscription SensorStatusIndividualSubscriptionGET(ctx, subscriptionId) The GET method is used to retrieve information about this subscription This method shall support the request and response data structures, and response codes, as specified in Tables 7.8.3.1-1 and 7.8.3.1-2 diff --git a/go-apps/meep-iot/server/meep-iot_test.go b/go-apps/meep-iot/server/meep-iot_test.go index 174d0d1cfa53081c83c83ecda97d98d2b91982c6..cc73e383efd5f450da8556a70b1781f1d33a7acd 100644 --- a/go-apps/meep-iot/server/meep-iot_test.go +++ b/go-apps/meep-iot/server/meep-iot_test.go @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024 The AdvantEDGE Authors + * Copyright (c) 2025 The AdvantEDGE Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -547,8 +547,8 @@ func TestRegisterediotplatformsPOST(t *testing.T) { Addresses: expected_adresses, } var expected_userTransportInfo = []MbTransportInfo{} - var mb_transportInfo TransportType - mb_transportInfo = MB_TOPIC_BASED + //var mb_transportInfo TransportType + mb_transportInfo := MB_TOPIC_BASED var security = SecurityInfo{} var implSpecificInfo = ImplSpecificInfo{} expected_userTransportInfo = append(expected_userTransportInfo, MbTransportInfo{ @@ -571,8 +571,8 @@ func TestRegisterediotplatformsPOST(t *testing.T) { var expected_endPointInfo_1 = EndPointInfo{ Addresses: expected_adresses_1, } - var transportInfo TransportType - transportInfo = REST_HTTP + //var transportInfo TransportType + transportInfo := REST_HTTP expected_customServicesTransportInfo = append(expected_customServicesTransportInfo, TransportInfo{ Id: "2ddb713c-2b41-4ded-a7ad-a5a047c5df13", Name: "/laboai-acme-ic-cse", @@ -700,10 +700,10 @@ func TestRegisterediotplatformsPOSTFail_1(t *testing.T) { /****************************** * request body section ******************************/ - var mb_transportInfo TransportType - mb_transportInfo = MB_TOPIC_BASED - var transportInfo TransportType - transportInfo = REST_HTTP + //var mb_transportInfo TransportType + mb_transportInfo := MB_TOPIC_BASED + //var transportInfo TransportType + transportInfo := REST_HTTP //var security = SecurityInfo{} // Missing Security var implSpecificInfo = ImplSpecificInfo{} var adresses = []Addresses{} @@ -793,10 +793,10 @@ func TestRegisterediotplatformsPOSTFail_2(t *testing.T) { /****************************** * request body section ******************************/ - var mb_transportInfo TransportType - mb_transportInfo = MB_TOPIC_BASED - var transportInfo TransportType - transportInfo = REST_HTTP + //var mb_transportInfo TransportType + mb_transportInfo := MB_TOPIC_BASED + //var transportInfo TransportType + transportInfo := REST_HTTP var security = SecurityInfo{} //var implSpecificInfo = ImplSpecificInfo{} // Missing ImplSpecificInfo var adresses = []Addresses{} @@ -887,10 +887,8 @@ func TestRegisterediotplatformsPOSTFail_3(t *testing.T) { /****************************** * request body section ******************************/ - //var mb_transportInfo TransportType // Missing TransportType - //mb_transportInfo = MB_TOPIC_BASED - var transportInfo TransportType - transportInfo = REST_HTTP + //mb_transportInfo := MB_TOPIC_BASED // Missing TransportType + transportInfo := REST_HTTP var security = SecurityInfo{} var implSpecificInfo = ImplSpecificInfo{} var adresses = []Addresses{} @@ -1544,12 +1542,10 @@ func TestRegistereddevicesByIdGET(t *testing.T) { } func create_registered_iot_platforms() (resp IotPlatformInfo, err error) { - var mb_transportInfo TransportType - mb_transportInfo = MB_TOPIC_BASED + mb_transportInfo := MB_TOPIC_BASED var security = SecurityInfo{} var implSpecificInfo = ImplSpecificInfo{} - var transportInfo TransportType - transportInfo = REST_HTTP + transportInfo := REST_HTTP var adresses = []Addresses{} adresses = append(adresses, Addresses{ Host: "172.29.10.56", @@ -1638,13 +1634,13 @@ func validate_iot_platform_info(received IotPlatformInfo, expected IotPlatformIn if len(received.UserTransportInfo) != len(expected.UserTransportInfo) { fmt.Println("len(received.UserTransportInfo) mismatch") return false - } else { + // TODO FSCOM } else { } if len(received.CustomServicesTransportInfo) != len(expected.CustomServicesTransportInfo) { fmt.Println("len(received.CustomServicesTransportInfo) mismatch") return false - } else { + // TODO FSCOM } else { } if received.Enabled != expected.Enabled { @@ -1840,13 +1836,13 @@ func validate_device_info(expected_device DeviceInfo, received_deviceResp Device if len(expected_device.RequestedMecTrafficRule) != len(received_deviceResp.RequestedMecTrafficRule) { fmt.Println("received_deviceResp.RequestedMecTrafficRule != RequestedMecTrafficRule") return false - } else { + // TODO FSCOM } else { // for i, val := range expected_device.RequestedMecTrafficRule { // } // End of 'for' statement - // TODO To be continued + // TODO FSCOM To be continued //RequestedMecTrafficRule []TrafficRuleDescriptor } - // TODO To be continued + // TODO FSCOM To be continued return true } diff --git a/go-packages/meep-sss-client/README.md b/go-packages/meep-sss-client/README.md index b7a741b5982386ebdb02c186d2640ac366ed75f0..6bfa0a4cc2635c4fd08fda90227b5727b6360157 100644 --- a/go-packages/meep-sss-client/README.md +++ b/go-packages/meep-sss-client/README.md @@ -37,7 +37,7 @@ Class | Method | HTTP request | Description *SensorDiscoverySubscriptionApi* | [**SensorDiscoverySubscriptionPUT**](docs/SensorDiscoverySubscriptionApi.md#sensordiscoverysubscriptionput) | **Put** /subscriptions/sensor_discovery/{subscriptionId} | The POST method is used to create a new subscription to sensor discovery notifications *SensorManagementApi* | [**SensorMgmtGET**](docs/SensorManagementApi.md#sensormgmtget) | **Get** /sensor_management | The GET method is used to receive the sensor characteristics that can be modified on specific sensors *SensorStatusLookupApi* | [**SensorStatusLookupGET**](docs/SensorStatusLookupApi.md#sensorstatuslookupget) | **Get** /queries/sensor_status | The GET method is used to query the available status -*SensorStatusSubscriptionApi* | [**SensorSatusIndividualSubscriptionGET**](docs/SensorStatusSubscriptionApi.md#sensorsatusindividualsubscriptionget) | **Get** /subscriptions/sensor_status/{subscriptionId} | The GET method is used to retrieve information about this subscription +*SensorStatusSubscriptionApi* | [**SensorStatusIndividualSubscriptionGET**](docs/SensorStatusSubscriptionApi.md#sensorsatusindividualsubscriptionget) | **Get** /subscriptions/sensor_status/{subscriptionId} | The GET method is used to retrieve information about this subscription *SensorStatusSubscriptionApi* | [**SensorStatusIndividualSubscriptionGET**](docs/SensorStatusSubscriptionApi.md#sensorstatusindividualsubscriptionget) | **Get** /subscriptions/sensor_status | The GET method is used to request information about the subscriptions related to sensor status for this requestor *SensorStatusSubscriptionApi* | [**SensorStatusSubscriptionDELETE**](docs/SensorStatusSubscriptionApi.md#sensorstatussubscriptiondelete) | **Delete** /subscriptions/sensor_status/{subscriptionId} | The DELETE method is used to cancel the existing subscription *SensorStatusSubscriptionApi* | [**SensorStatusSubscriptionPUT**](docs/SensorStatusSubscriptionApi.md#sensorstatussubscriptionput) | **Put** /subscriptions/sensor_status/{subscriptionId} | The PUT method is used to update the existing subscription diff --git a/go-packages/meep-sss-client/api/swagger.yaml b/go-packages/meep-sss-client/api/swagger.yaml index e996e3457f92046ec7d773daff885f99e0e110c8..b77aa69a1d2b495d788250b147f6d20001735258 100644 --- a/go-packages/meep-sss-client/api/swagger.yaml +++ b/go-packages/meep-sss-client/api/swagger.yaml @@ -510,7 +510,7 @@ paths: summary: The GET method is used to retrieve information about this subscription description: "This method shall support the request and response data structures,\ \ and response codes, as specified in Tables 7.8.3.1-1 and 7.8.3.1-2" - operationId: SensorSatusIndividualSubscriptionGET + operationId: SensorStatusIndividualSubscriptionGET parameters: - name: subscriptionId in: path diff --git a/go-packages/meep-sss-client/api_sensor_status_subscription.go b/go-packages/meep-sss-client/api_sensor_status_subscription.go index 3be94b99f3e3b2e88d938149e9f1974026e6d592..704336348cf8af943606476b3d8b897065789e08 100644 --- a/go-packages/meep-sss-client/api_sensor_status_subscription.go +++ b/go-packages/meep-sss-client/api_sensor_status_subscription.go @@ -34,7 +34,7 @@ This method shall support the request and response data structures, and response * @param subscriptionId Unique identifiers of the subscription @return []SensorStatusSubscription */ -func (a *SensorStatusSubscriptionApiService) SensorSatusIndividualSubscriptionGET(ctx context.Context, subscriptionId string) ([]SensorStatusSubscription, *http.Response, error) { +func (a *SensorStatusSubscriptionApiService) SensorStatusIndividualSubscriptionGET(ctx context.Context, subscriptionId string) ([]SensorStatusSubscription, *http.Response, error) { var ( localVarHttpMethod = strings.ToUpper("Get") localVarPostBody interface{} diff --git a/go-packages/meep-sss-mgr/go.sum b/go-packages/meep-sss-mgr/go.sum index 006aacd6c4a21fb65386d78a4b64559473586a18..6285c5a4a04f396c68dbaa04b0190eda89fe193d 100644 --- a/go-packages/meep-sss-mgr/go.sum +++ b/go-packages/meep-sss-mgr/go.sum @@ -1,27 +1,132 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6rNA5PM12m4= github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA= github.com/eclipse/paho.mqtt.golang v1.4.3 h1:2kwcUGn8seMUfWndX0hGbvH8r7crgcJguQNCyp70xik= github.com/eclipse/paho.mqtt.golang v1.4.3/go.mod h1:CSYvoAlsMkhYOXh/oKyxa8EcBci6dVkLCbo5tTC1RIE= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= @@ -32,6 +137,8 @@ github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/roymx/viper v1.3.3-0.20190416163942-b9a223fc58a3 h1:lBNvYUFo7d4fHs8BXUmoTzbdUo4usq6PlP5qn894sGA= github.com/roymx/viper v1.3.3-0.20190416163942-b9a223fc58a3/go.mod h1:jo59Sv6xirZtbxbaZbCtrQd1CSufmcxJZIC8hm2tepw= github.com/sirupsen/logrus v1.4.1 h1:GL2rEmy6nsikmW0r8opw9JIRScdMF5hA8cOYLH7In1k= @@ -46,39 +153,149 @@ github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/streadway/amqp v1.1.0 h1:py12iX8XSyI7aN/3dUT8DFIDJazNJsVJdxNVEpnQTZM= github.com/streadway/amqp v1.1.0/go.mod h1:WYSrTEYHOXHd0nwFeUXAe2G2hRnQT+deZJJf88uS9Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0 h1:Jcxah/M+oLZ/R4/z5RzfPzGbPXnVDPkEDtf2JnuxN+U= golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a h1:1n5lsVfiQW3yfsRGu98756EH1YthsFqr/5mxHduZW2A= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -88,19 +305,151 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/go-packages/meep-sss-mgr/onem2m-mgr.go b/go-packages/meep-sss-mgr/onem2m-mgr.go index ad1ca95d64d1c65e9b712164c5eeed36d52bc2b8..ae91484e1afa1e7660f73090afc66affb3fcaebd 100644 --- a/go-packages/meep-sss-mgr/onem2m-mgr.go +++ b/go-packages/meep-sss-mgr/onem2m-mgr.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package onem2mmgr +package sssmgr import ( "bytes" @@ -36,149 +36,48 @@ import ( "github.com/gorilla/mux" ) -// IOT Manager -type IotMgr struct { - name string - namespace string - mutex sync.Mutex - wg sync.WaitGroup - refreshTicker *time.Ticker +// Sensors-Sharing Service Manager +type SssMgr struct { + name string + namespace string + mutex sync.Mutex + wg sync.WaitGroup + refreshTicker *time.Ticker + sss_discovery_notify func() + sss_status_notify func() + sss_data_notify func() } type IotPlatformInfo struct { - IotPlatformId string - UserTransportInfo []MbTransportInfo - CustomServicesTransportInfo []TransportInfo - Enabled bool - DeviceInfo *DeviceInfo + Address string + Port int + Name string + IotPlatformId string } -type MbTransportInfo struct { - Id string - Name string - Description string - Type_ *string - Protocol string - Version string - Endpoint *EndPointInfo - Security *SecurityInfo - ImplSpecificInfo *ImplSpecificInfo +type Point struct { + Latitude float64 + Longitude float64 } -type TransportInfo struct { - Id string - Name string - Description string - Type_ *string - Protocol string - Version string - Endpoint *EndPointInfo - Security *SecurityInfo - ImplSpecificInfo string -} - -type EndPointInfo struct { - Uris []string - Fqdn []string - Addresses []Addresses - Alternative string -} - -type Addresses struct { - Host string - Port int32 -} - -type SecurityInfo struct { - OAuth2Info *OAuth2Info - Extensions string -} - -type OAuth2Info struct { - GrantTypes []string - TokenEndpoint string -} - -type ImplSpecificInfo struct { - EventTopics []string - UplinkTopics []string - DownlinkTopics []string -} - -// ETSI GS MEC 046 V3.1.1 (2024-04) Clause 6.2.1 Type: SensorDiscoveryInfo type SensorCharacteristic struct { CharacteristicName string CharacteristicValue string CharacteristicUnitOfMeasure *string } -type TrafficRuleDescriptor struct { - TrafficRuleId string - FilterType string - Priority int32 - TrafficFilter []TrafficFilter - Action string - DstInterface *InterfaceDescriptor -} - -type InterfaceDescriptor struct { - InterfaceType string - //TunnelInfo *TunnelInfo FSCOM Not supported - SrcMACAddress string - DstMACAddress string - DstIPAddress string -} - -type TrafficFilter struct { - SrcAddress []string - DstAddress []string - SrcPort []string - DstPort []string - Protocol []string - Tag []string - Uri []string - PacketLabel []string - SrcTunnelAddress []string - TgtTunnelAddress []string - SrcTunnelPort []string - DstTunnelPort []string - QCI int32 - TC int32 -} - -type KeyValuePair struct { - Key string - Value string -} - -type DeviceInfo struct { - DeviceAuthenticationInfo string - DeviceMetadata []KeyValuePair - Gpsi string - Pei string - Supi string - Msisdn string - Imei string - Imsi string - Iccid string - DeviceId string - RequestedMecTrafficRule []TrafficRuleDescriptor - RequestedIotPlatformId string - RequestedUserTransportId string - //DeviceSpecificMessageFormats *DeviceSpecificMessageFormats - //DownlinkInfo *DownlinkInfo - ClientCertificate string - Enabled bool - // SensorIdentifier string - // SensorStatusType string - // SensorPropertyList []string - // SensorCharacteristicList []SensorCharacteristic +type SensorDiscoveryInfo struct { + SensorIdentifier string + SensorType string + SensorPropertyList []string + SensorCharacteristicList []SensorCharacteristic + SensorPosition *Point + IotPlatformId string } var registeredIotPlatformsMap = map[string]IotPlatformInfo{} // List of discovered IOT Plateform -var devicesMap = map[string]DeviceInfo{} // Map device by deviceId -var devicesPerPlatformMap = map[string][]string{} // Map deviceIds per platform -var platformPerUserTransportIdMap = map[string][]string{} // Map userTransportId per platform +var sensorsMap = map[string]SensorDiscoveryInfo{} // Map sensors by sensorIdentifier +var sensorsPerPlatformMap = map[string][]string{} // Map dsensorIdentifiers per platform // Timer to refresh devices list for all IoT platform const refreshTickerExpeary = 10 // In seconds @@ -189,19 +88,23 @@ const profiling = false var profilingTimers map[string]time.Time const ( - headerAccept = "application/json" - headerContentType = "application/json" + headerAccept = "application/json" + headerContentType = "application/json" + iot_platform_address = "lab-oai.etsi.org" + iot_platform_port = 31110 + iot_platform_name = "laboai-acme-ic-cse" + iot_platform_id = "7feaadbb0400" ) -// NewIotMgr - Creates and initializes a new IOT Traffic Manager -func NewIotMgr(name string, namespace string) (tm *IotMgr, err error) { +// NewSssMgr - Creates and initializes a new SSS Traffic Manager +func NewSssMgr(name string, namespace string, sss_discovery_notify func(), sss_status_notify func(), sss_data_notify func()) (tm *SssMgr, err error) { if name == "" { err = errors.New("Missing connector name") return nil, err } // Create new Traffic Manager - tm = new(IotMgr) + tm = new(SssMgr) tm.name = name if namespace != "" { tm.namespace = namespace @@ -209,33 +112,41 @@ func NewIotMgr(name string, namespace string) (tm *IotMgr, err error) { tm.namespace = "default" } + tm.sss_discovery_notify = sss_discovery_notify + tm.sss_status_notify = sss_status_notify + tm.sss_data_notify = sss_data_notify + tm.init() return tm, nil } // Profiling init -func (tm *IotMgr) init() { +func (tm *SssMgr) init() { if profiling { profilingTimers = make(map[string]time.Time) } - registeredIotPlatformsMap = make(map[string]IotPlatformInfo, 0) - devicesMap = make(map[string]DeviceInfo, 0) - devicesPerPlatformMap = make(map[string][]string, 0) - platformPerUserTransportIdMap = make(map[string][]string, 0) - + registeredIotPlatformsMap = make(map[string]IotPlatformInfo, 1) + registeredIotPlatformsMap[iot_platform_address] = IotPlatformInfo{ // FIXME FSCOM How to register IoT platform to meep-sss (see meep-iot?) + Address: iot_platform_address, + Port: iot_platform_port, + Name: iot_platform_name, + IotPlatformId: iot_platform_id, + } + sensorsMap = make(map[string]SensorDiscoveryInfo, 0) + sensorsPerPlatformMap = make(map[string][]string, 0) tm.refreshTicker = nil } -// DeleteIotMgr - -func (tm *IotMgr) DeleteIotMgr() (err error) { +// DeleteSssMgr - +func (tm *SssMgr) DeleteSssMgr() (err error) { tm.stopRefreshTicker() return nil } -func (tm *IotMgr) startRefreshTicker() { +func (tm *SssMgr) startRefreshTicker() { log.Debug("Starting refresh loop") tm.refreshTicker = time.NewTicker(refreshTickerExpeary * time.Second) go func() { @@ -253,167 +164,85 @@ func (tm *IotMgr) startRefreshTicker() { }() } -func (tm *IotMgr) stopRefreshTicker() { +func (tm *SssMgr) stopRefreshTicker() { if tm.refreshTicker != nil { // Refresh the list of devices tm.wg.Add(1) tm.refreshTicker.Stop() tm.refreshTicker = nil registeredIotPlatformsMap = nil - devicesMap = nil - devicesPerPlatformMap = nil - platformPerUserTransportIdMap = nil + sensorsMap = nil + sensorsPerPlatformMap = nil tm.wg.Done() log.Debug("Refresh loop stopped") } } -func (tm *IotMgr) RegisterIotPlatformInfo(iotPlatformInfo IotPlatformInfo) (err error) { - if profiling { - profilingTimers["RegisterIotPlatformInfo"] = time.Now() - } - - log.Info(">>> RegisterIotPlatformInfo: iotPlatformId: ", iotPlatformInfo) - if iotPlatformInfo.Enabled { - registeredIotPlatformsMap[iotPlatformInfo.IotPlatformId] = iotPlatformInfo - } // else, Skip disabled platform - - if len(registeredIotPlatformsMap) == 1 { - log.Info("RegisterIotPlatformInfo: Starting timer") - tm.startRefreshTicker() - log.Info("RegisterIotPlatformInfo: timer running") - } - - if profiling { - now := time.Now() - log.Debug("RegisterIotPlatformInfo: ", now.Sub(profilingTimers["RegisterIotPlatformInfo"])) - } - return nil -} - -func (tm *IotMgr) DeregisterIotPlatformInfo(iotPlatformId string) (err error) { +func (tm *SssMgr) SensorDiscoveryInfoAll() (sensors []SensorDiscoveryInfo, err error) { if profiling { - profilingTimers["DeregisterIotPlatformInfo"] = time.Now() + profilingTimers["GetDevices"] = time.Now() } - tm.wg.Wait() - log.Info("DeregisterIotPlatformInfo: After Synchro") - - log.Info(">>> DeregisterIotPlatformInfo: iotPlatformId: ", iotPlatformId) - // Remove the list of the devices for this IoT platform - if val, ok := devicesPerPlatformMap[iotPlatformId]; ok { - // Free resources from devicesMap map - for _, dev := range val { - delete(devicesMap, dev) - } // End of 'for' statement - delete(devicesPerPlatformMap, iotPlatformId) - log.Info("DeregisterIotPlatformInfo: platformPerUserTransportIdMap (before): ", iotPlatformId) - for _, rule := range platformPerUserTransportIdMap { - for idx, pltf := range rule { - if pltf == iotPlatformId { - rule = append(rule[:idx], rule[idx+1:]...) - } - } // End of 'for' statement - } // End of 'for' statement - log.Info("DeregisterIotPlatformInfo: platformPerUserTransportIdMap (after): ", iotPlatformId) - } - if _, ok := registeredIotPlatformsMap[iotPlatformId]; ok { - delete(registeredIotPlatformsMap, iotPlatformId) - if len(registeredIotPlatformsMap) == 0 { - tm.stopRefreshTicker() - } - } + log.Info(">>> SensorDiscoveryInfoAll") - if profiling { - now := time.Now() - log.Debug("DeregisterIotPlatformInfo: ", now.Sub(profilingTimers["DeregisterIotPlatformInfo"])) - } - return nil -} - -func (tm *IotMgr) GetDevices() (devices []DeviceInfo, err error) { - if profiling { - profilingTimers["GetDevices"] = time.Now() + err = tm.populateDevicesPerIotPlatforms() // FIXME FSCOM User timer. See startRefreshTicker + if err != nil { + return sensors, err } - log.Info(">>> GetDevices") - tm.wg.Wait() - log.Info("GetDevices: After Synchro") + log.Info("SensorDiscoveryInfoAll: After Synchro") - devices = make([]DeviceInfo, 0) + sensors = make([]SensorDiscoveryInfo, 0) if len(registeredIotPlatformsMap) == 0 { - return devices, nil + return sensors, nil } - for _, v := range devicesMap { - log.Info("GetDevices: adding device: ", v) - devices = append(devices, v) + for _, v := range sensorsMap { + log.Info("SensorDiscoveryInfoAll: adding sensor: ", v) + sensors = append(sensors, v) } // End of 'for' statement - log.Info("GetDevices: devices: ", devices) + log.Info("SensorDiscoveryInfoAll: sensors: ", sensors) if profiling { now := time.Now() - log.Debug("GetDevices: ", now.Sub(profilingTimers["GetDevices"])) + log.Debug("SensorDiscoveryInfoAll: ", now.Sub(profilingTimers["GetDevices"])) } - return devices, nil + return sensors, nil } -func (tm *IotMgr) GetDevice(deviceId string) (device DeviceInfo, err error) { +func (tm *SssMgr) GetSensor(sensorIdentifier string) (sensor SensorDiscoveryInfo, err error) { if profiling { - profilingTimers["GetDevice"] = time.Now() + profilingTimers["GetSensor"] = time.Now() } - log.Info(">>> GetDevice: deviceId: ", deviceId) + log.Info(">>> GetSensor: sensorIdentifier: ", sensorIdentifier) tm.wg.Wait() - log.Info("GetDevice: After Synchro") + log.Info("GetSensor: After Synchro") - if val, ok := devicesMap[deviceId]; !ok { + if val, ok := sensorsMap[sensorIdentifier]; !ok { err = errors.New("Wrong Device identifier") - return device, err + return sensor, err } else { - device = val + sensor = val } if profiling { now := time.Now() - log.Debug("GetDevice: ", now.Sub(profilingTimers["GetDevice"])) - } - log.Info("GetDevice: device: ", device) - - return device, nil -} - -func (tm *IotMgr) CreateDevice(device DeviceInfo) (deviceResp DeviceInfo, err error) { - log.Info(">>> CreateDevice: ", device) - - // RequestedMecTrafficRule is not supported yet - if len(device.RequestedMecTrafficRule) != 0 { - err = errors.New("Unsupported traffic rule provided") - log.Error(err.Error()) - return deviceResp, nil - } - if len(device.RequestedIotPlatformId) != 0 { - deviceResp, err = tm.createDeviceWithIotPlatformId(device, device.RequestedIotPlatformId) - } else { - deviceResp, err = tm.createDeviceWithRequestedUserTransportId(device, device.RequestedUserTransportId) - } - if err != nil { - log.Error(err.Error()) - return deviceResp, err + log.Debug("GetSensor: ", now.Sub(profilingTimers["GetSensor"])) } - log.Info("CreateDevice: deviceResp: ", deviceResp) + log.Info("GetSensor: sensor: ", sensor) - return deviceResp, nil + return sensor, nil } /* * func populateDevicesPerIotPlatforms IoT devices for all registered Iot platform * @return {struct} nil on success, error otherwise */ -func (tm *IotMgr) populateDevicesPerIotPlatforms() error { +func (tm *SssMgr) populateDevicesPerIotPlatforms() error { tm.mutex.Lock() defer tm.mutex.Unlock() @@ -428,8 +257,8 @@ func (tm *IotMgr) populateDevicesPerIotPlatforms() error { // Refresh the list of devices for all registered Iot platform for _, iotPlatform := range registeredIotPlatformsMap { - log.Debug("populateDevicesPerIotPlatforms: processing: ", iotPlatform.IotPlatformId) - err := tm.populateDevices(iotPlatform) + log.Debug("populateDevicesPerIotPlatforms: processing: ", iotPlatform.Address) + err := tm.populateSensors(iotPlatform) if err != nil { log.Error("populateDevicesPerIotPlatforms: ", err) continue @@ -449,253 +278,232 @@ func (tm *IotMgr) populateDevicesPerIotPlatforms() error { * @param {string} iotPlatformId contains the IoT platform identifier * @return {struct} nil on success, error otherwise */ -func (tm *IotMgr) populateDevices(iotPlatformInfo IotPlatformInfo) error { +func (tm *SssMgr) populateSensors(iotPlatformInfo IotPlatformInfo) error { if profiling { - profilingTimers["populateDevices"] = time.Now() + profilingTimers["populateSensors"] = time.Now() } - log.Info(">>> populateDevices: iotPlatformId=", iotPlatformInfo.IotPlatformId) + log.Info(">>> populateSensors: iotPlatformId=", iotPlatformInfo.Address) // 1. Get the list of the AE // Build the URL - t := registeredIotPlatformsMap[iotPlatformInfo.IotPlatformId].CustomServicesTransportInfo[0] - log.Debug("populateDevices: t.Endpoint.Addresses[0]=", t.Endpoint.Addresses[0]) - url := "http://" + t.Endpoint.Addresses[0].Host + ":" + strconv.Itoa(int(t.Endpoint.Addresses[0].Port)) + "/" + t.Name - log.Debug("populateDevices: url=", url) + url := "http://" + iotPlatformInfo.Address + ":" + strconv.Itoa(int(iotPlatformInfo.Port)) + "/" + iotPlatformInfo.Name + log.Debug("populateSensors: url=", url) // Build the headers var headers = http.Header{} headers["Accept"] = []string{headerAccept} headers["Content-Type"] = []string{headerContentType} headers["X-M2M-Origin"] = []string{"CAdmin"} // FIXME FSCOM How to get it headers["X-M2M-RI"] = []string{uuid.New().String()} - headers["X-M2M-RVI"] = []string{t.Version} + headers["X-M2M-RVI"] = []string{"4"} // FIXME FSCOM How to get it // Build the queries queries := map[string]string{} queries["fu"] = "1" // Filter usage - queries["ty"] = "4" // Filter on oneM2M CIN for device + queries["ty"] = "4" // Filter on oneM2M CIN for sensors // Send the request response, err := sendRequest("GET", url, headers, nil, nil, queries, 200) if err != nil { - log.Error("populateDevices: ", err.Error()) + log.Error("populateSensors: ", err.Error()) return err } - log.Debug("populateDevices: response: ", string(response)) + log.Debug("populateSensors: response: ", string(response)) var oneM2M_uril map[string][]string err = json.Unmarshal(response, &oneM2M_uril) if err != nil { - log.Error("populateDevices: ", err.Error()) + log.Error("populateSensors: ", err.Error()) return err } - log.Debug("populateDevices: oneM2M_uril: ", len(oneM2M_uril)) + log.Debug("populateSensors: oneM2M_uril: ", len(oneM2M_uril)) log.Debug(oneM2M_uril) if _, ok := oneM2M_uril["m2m:uril"]; !ok { - err := errors.New("populateDevices: Key not found: m2m:uril") + err := errors.New("populateSensors: CharacteristicName not found: m2m:uril") log.Error(err.Error()) return err } - // Loop for each CIN and build the device list + // Loop for each CIN and build the sensor list for _, v := range oneM2M_uril["m2m:uril"] { - log.Debug("populateDevices: Processing key: ", v) + log.Debug("populateSensors: Processing key: ", v) - url := "http://" + t.Endpoint.Addresses[0].Host + ":" + strconv.Itoa(int(t.Endpoint.Addresses[0].Port)) + "/" + v - log.Debug("populateDevices: url=", url) + url := "http://" + iotPlatformInfo.Address + ":" + strconv.Itoa(int(iotPlatformInfo.Port)) + "/" + v + log.Debug("populateSensors: url=", url) // Build the headers var headers = http.Header{} headers["Accept"] = []string{headerAccept} headers["Content-Type"] = []string{headerContentType} headers["X-M2M-Origin"] = []string{"CAdmin"} // FIXME FSCOM How to get it headers["X-M2M-RI"] = []string{uuid.New().String()} - headers["X-M2M-RVI"] = []string{t.Version} + headers["X-M2M-RVI"] = []string{"4"} // FIXME FSCOM How to get it // Build the queries queries := map[string]string{} queries["fu"] = "2" // Filter usage // Send the request response, err := sendRequest("GET", url, headers, nil, nil, queries, 200) if err != nil { - log.Error("populateDevices: ", err.Error()) + log.Error("populateSensors: ", err.Error()) return err } - log.Debug("populateDevices: response: ", string(response)) + log.Debug("populateSensors: response: ", string(response)) var oneM2M_cin map[string]map[string]interface{} err = json.Unmarshal(response, &oneM2M_cin) if err != nil { - log.Error("populateDevices: ", err.Error()) + log.Error("populateSensors: ", err.Error()) continue } - log.Debug("populateDevices: type(oneM2M_cin): ", reflect.TypeOf(oneM2M_cin)) - log.Debug("populateDevices: len(oneM2M_cin): ", len(oneM2M_cin)) - log.Debug("populateDevices: oneM2M_cin: ", oneM2M_cin) + log.Debug("populateSensors: type(oneM2M_cin): ", reflect.TypeOf(oneM2M_cin)) + log.Debug("populateSensors: len(oneM2M_cin): ", len(oneM2M_cin)) + log.Debug("populateSensors: oneM2M_cin: ", oneM2M_cin) for _, m := range oneM2M_cin { //log.Debug("==> ", i, " value is ", m) - var device = DeviceInfo{} - device.RequestedIotPlatformId = iotPlatformInfo.IotPlatformId - device.RequestedUserTransportId = registeredIotPlatformsMap[iotPlatformInfo.IotPlatformId].UserTransportInfo[0].Id - device.Enabled = true + var sensor = SensorDiscoveryInfo{ + IotPlatformId: iotPlatformInfo.IotPlatformId, + } // m is a map[string]interface. // loop over keys and values in the map. for k, v := range m { log.Debug(k, " value is ", v) - log.Debug("populateDevices: type(v): ", reflect.TypeOf(v)) - - if item, ok := v.(string); ok { - device.DeviceMetadata = append( - device.DeviceMetadata, - KeyValuePair{ - Key: k, - Value: string(item), - }) - } else if item, ok := v.(float64); ok { - device.DeviceMetadata = append( - device.DeviceMetadata, - KeyValuePair{ - Key: k, - Value: strconv.FormatFloat(item, 'f', -1, 64), - }) - } else if item, ok := v.(int64); ok { - device.DeviceMetadata = append( - device.DeviceMetadata, - KeyValuePair{ - Key: k, - Value: strconv.FormatInt(item, 10), - }) - } else if item, ok := v.(bool); ok { - device.DeviceMetadata = append( - device.DeviceMetadata, - KeyValuePair{ - Key: k, - Value: strconv.FormatBool(item), - }) - } else if item, ok := v.([]string); ok { - device.DeviceMetadata = append( - device.DeviceMetadata, - KeyValuePair{ - Key: k, - Value: strings.Join(item, ","), - }) + log.Debug("populateSensors: type(v): ", reflect.TypeOf(v)) + + if k == "ri" { + if item, ok := v.(string); ok { + sensor.SensorIdentifier = item + } else { + log.Error("populateSensors: Failed to process ", k) + } + } else if k == "ty" { + if item, ok := v.(float64); ok { + sensor.SensorType = strconv.FormatFloat(item, 'f', -1, 64) + } else { + log.Error("populateSensors: Failed to process ", k) + } } else { - log.Error("populateDevices: Failed to process ", k) + sensor.SensorPropertyList = append(sensor.SensorPropertyList, k) + if item, ok := v.(string); ok { + sensor.SensorCharacteristicList = append( + sensor.SensorCharacteristicList, + SensorCharacteristic{ + CharacteristicName: k, + CharacteristicValue: string(item), + }) + } else if item, ok := v.(float64); ok { + sensor.SensorCharacteristicList = append( + sensor.SensorCharacteristicList, + SensorCharacteristic{ + CharacteristicName: k, + CharacteristicValue: strconv.FormatFloat(item, 'f', -1, 64), + }) + } else if item, ok := v.(int64); ok { + sensor.SensorCharacteristicList = append( + sensor.SensorCharacteristicList, + SensorCharacteristic{ + CharacteristicName: k, + CharacteristicValue: strconv.FormatInt(item, 10), + }) + } else if item, ok := v.(bool); ok { + sensor.SensorCharacteristicList = append( + sensor.SensorCharacteristicList, + SensorCharacteristic{ + CharacteristicName: k, + CharacteristicValue: strconv.FormatBool(item), + }) + } else if item, ok := v.([]string); ok { + sensor.SensorCharacteristicList = append( + sensor.SensorCharacteristicList, + SensorCharacteristic{ + CharacteristicName: k, + CharacteristicValue: strings.Join(item, ","), + }) + } else if item, ok := v.([]int64); ok { + log.Error("populateSensors: Failed to convert list of int64 into string: ", item) + } else if item, ok := v.([]interface{}); ok { + log.Debug("populateSensors: Got []interface {} for ", k) + log.Debug("populateSensors: ValueOf ", reflect.ValueOf(item)) + s := SensorCharacteristic{ + CharacteristicName: k, + } + var buf bytes.Buffer + fmt.Fprintf(&buf, "%T", reflect.ValueOf(item)) + s.CharacteristicValue = buf.String() + sensor.SensorCharacteristicList = append(sensor.SensorCharacteristicList, s) + } else { + log.Error("populateSensors: Failed to process ", k) + } } - // if k == "rn" { // if item, ok := v.(string); ok { - // device.DeviceId = item + // sensor.DeviceId = item // } else { - // log.Error("populateDevices: Failed to process ", k) + // log.Error("populateSensors: Failed to process ", k) // } // } else if k == "ri" { // if item, ok := v.(string); ok { - // device.SensorIdentifier = item + // sensor.SensorIdentifier = item // } else { - // log.Error("populateDevices: Failed to process ", k) + // log.Error("populateSensors: Failed to process ", k) // } // } else if k == "ty" { // if item, ok := v.(float64); ok { - // device.SensorStatusType = strconv.FormatFloat(item, 'f', -1, 64) + // sensor.SensorStatusType = strconv.FormatFloat(item, 'f', -1, 64) // } else { - // log.Error("populateDevices: Failed to process ", k) + // log.Error("populateSensors: Failed to process ", k) // } // } else { // default: if k == "lt" || k == "et" || k == "ct" || k == "st" || k == "pi" || k == "lbl" { // if item, ok := v.(string); ok { - // device.SensorCharacteristicList = append( - // device.SensorCharacteristicList, + // sensor.SensorCharacteristicList = append( + // sensor.SensorCharacteristicList, // SensorCharacteristic{ // CharacteristicName: k, // CharacteristicValue: string(item), // CharacteristicUnitOfMeasure: nil, // }) // } else if item, ok := v.(float64); ok { - // device.SensorCharacteristicList = append( - // device.SensorCharacteristicList, + // sensor.SensorCharacteristicList = append( + // sensor.SensorCharacteristicList, // SensorCharacteristic{ // CharacteristicName: k, // CharacteristicValue: strconv.FormatFloat(item, 'f', -1, 64), // CharacteristicUnitOfMeasure: nil, // }) // } else if item, ok := v.([]string); ok { - // device.SensorCharacteristicList = append( - // device.SensorCharacteristicList, + // sensor.SensorCharacteristicList = append( + // sensor.SensorCharacteristicList, // SensorCharacteristic{ // CharacteristicName: k, // CharacteristicValue: strings.Join(item, ","), // CharacteristicUnitOfMeasure: nil, // }) // } else { - // log.Error("populateDevices: Failed to process ", k) + // log.Error("populateSensors: Failed to process ", k) // } // } } // End of 'for' loop - log.Info("populateDevices: device: ", device) - devicesMap[device.DeviceId] = device - devicesPerPlatformMap[device.RequestedIotPlatformId] = append(devicesPerPlatformMap[device.RequestedIotPlatformId], device.DeviceId) + log.Info("populateSensors: sensor: ", sensor) + sensorsMap[sensor.SensorIdentifier] = sensor + sensorsPerPlatformMap[sensor.IotPlatformId] = append(sensorsPerPlatformMap[sensor.IotPlatformId], sensor.SensorIdentifier) } // End of 'for' loop } // End of 'for' statement - log.Info("populateDevices: devicesMap: ", devicesMap) - log.Info("populateDevices: devicesPerPlatformMap: ", devicesPerPlatformMap) + log.Info("populateSensors: sensorsMap: ", sensorsMap) + log.Info("populateSensors: sensorsPerPlatformMap: ", sensorsPerPlatformMap) if profiling { now := time.Now() - log.Debug("populateDevices: ", now.Sub(profilingTimers["populateDevices"])) + log.Debug("populateSensors: ", now.Sub(profilingTimers["populateSensors"])) } return nil } -func (tm *IotMgr) createDeviceWithIotPlatformId(device DeviceInfo, requestedIotPlatformId string) (deviceResp DeviceInfo, err error) { - log.Info(">>> createDeviceWithIotPlatformId: ", device) - - tm.wg.Wait() - log.Info("createDeviceWithIotPlatformId: After Synchro") - - // Sanity checks - if _, ok := registeredIotPlatformsMap[requestedIotPlatformId]; !ok { - err = errors.New("Invalid IotPlatform identifier") - return deviceResp, err - } - - deviceResp, err = tm.oneM2M_create(device, requestedIotPlatformId, "ae") - if err != nil { - log.Error("createDeviceWithIotPlatformId: ", err.Error()) - return device, err - } - log.Debug("createDeviceWithIotPlatformId: deviceResp: ", deviceResp) - - return deviceResp, nil -} - -func (tm *IotMgr) createDeviceWithRequestedUserTransportId(device DeviceInfo, requestedUserTransportId string) (deviceResp DeviceInfo, err error) { - log.Info(">>> createDeviceWithRequestedUserTransportId: ", device) - - tm.wg.Wait() - log.Info("createDeviceWithIotPlatformId: After Synchro") - - if val, ok := platformPerUserTransportIdMap[requestedUserTransportId]; ok { - deviceResp, err = tm.createDeviceWithIotPlatformId(device, val[0]) - } else { - err = errors.New("Invalid UserTransportId") - } - if err != nil { - log.Error("createDeviceWithIotPlatformId: ", err.Error()) - return deviceResp, err - } - log.Info("createDeviceWithIotPlatformId: deviceResp: ", deviceResp) - - return deviceResp, nil -} - -func (tm *IotMgr) oneM2M_create(device DeviceInfo, requestedIotPlatformId string, type_ string) (deviceResp DeviceInfo, err error) { +func (tm *SssMgr) oneM2M_create(sensor SensorDiscoveryInfo, requestedIotPlatformId string, type_ string) (sensorResp SensorDiscoveryInfo, err error) { // FIXME FSCOM: requestedIotPlatformId should be useless - t := registeredIotPlatformsMap[requestedIotPlatformId].CustomServicesTransportInfo[0] - log.Debug("oneM2M_create: t.Endpoint.Addresses[0]=", t.Endpoint.Addresses[0]) // 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{t.Version} + headers["X-M2M-RVI"] = []string{"4"} var s string if type_ == "AE" { s = headerContentType + ";ty=2" @@ -709,72 +517,71 @@ func (tm *IotMgr) oneM2M_create(device DeviceInfo, requestedIotPlatformId string // Initialize the entry if type_ == "AE" { // FIXME FSCOM Clarify how to map Deviceinfo with oneM2M AE/CNT/fexContainer bodyMap["m2m:ae"] = make(map[string]interface{}, 0) - bodyMap["m2m:ae"]["api"] = "Norg.etsi." + requestedIotPlatformId + "." + device.DeviceId - bodyMap["m2m:ae"]["rn"] = device.DeviceId + bodyMap["m2m:ae"]["api"] = "Norg.etsi." + requestedIotPlatformId + "." + sensor.SensorIdentifier + bodyMap["m2m:ae"]["rn"] = sensor.SensorIdentifier bodyMap["m2m:ae"]["rr"] = false - bodyMap["m2m:ae"]["srv"] = []string{t.Version} - url = "http://" + t.Endpoint.Addresses[0].Host + ":" + strconv.Itoa(int(t.Endpoint.Addresses[0].Port)) + "/" + t.Name + bodyMap["m2m:ae"]["srv"] = []string{"4"} + url = "http://" + registeredIotPlatformsMap[requestedIotPlatformId].Address + ":" + strconv.Itoa(int(registeredIotPlatformsMap[requestedIotPlatformId].Port)) + "/" + registeredIotPlatformsMap[requestedIotPlatformId].Name + } else if type_ == "CNT" { bodyMap["m2m:cnt"] = make(map[string]interface{}, 0) bodyMap["m2m:cnt"]["mbs"] = 10000 bodyMap["m2m:cnt"]["mni"] = 10 - bodyMap["m2m:cnt"]["rn"] = device.DeviceId - bodyMap["m2m:cnt"]["srv"] = []string{t.Version} + bodyMap["m2m:cnt"]["rn"] = sensor.SensorIdentifier + bodyMap["m2m:cnt"]["srv"] = []string{"4"} // Add metadata - if len(device.DeviceMetadata) != 0 { - for _, val := range device.DeviceMetadata { + if len(sensor.SensorCharacteristicList) != 0 { + for _, val := range sensor.SensorCharacteristicList { log.Debug("oneM2M_create: Adding CNT metadata: ", val) // FIXME FSCOM Add metadata } // End of 'for' statement } - url = "http://" + t.Endpoint.Addresses[0].Host + ":" + strconv.Itoa(int(t.Endpoint.Addresses[0].Port)) + "/" + t.Name + url = "http://" + registeredIotPlatformsMap[requestedIotPlatformId].Address + ":" + strconv.Itoa(int(registeredIotPlatformsMap[requestedIotPlatformId].Port)) + "/" + registeredIotPlatformsMap[requestedIotPlatformId].Name } else { err = errors.New("oneM2M_create: Invalid type") log.Error("oneM2M_create: ", err.Error()) - return deviceResp, err + return sensorResp, err } log.Debug("oneM2M_create: url=", url) log.Debug("oneM2M_create: bodyMap=", bodyMap) body, err := json.Marshal(bodyMap) if err != nil { log.Error("oneM2M_create: ", err.Error()) - return deviceResp, err + return sensorResp, err } log.Debug("oneM2M_create: 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_create: ", err.Error()) - return deviceResp, err + return sensorResp, err } log.Debug("oneM2M_create: response: ", string(response)) var d map[string]map[string]interface{} err = json.Unmarshal(response, &d) if err != nil { log.Error("oneM2M_create: ", err.Error()) - return deviceResp, err + return sensorResp, err } log.Debug("oneM2M_create: d: ", d) // Add additional entries - deviceResp, err = tm.oneM2M_deserialize(deviceResp, d) + sensorResp, err = tm.oneM2M_deserialize(sensorResp, d) if err != nil { log.Error("oneM2M_create: ", err.Error()) - return deviceResp, err + return sensorResp, err } - log.Debug("oneM2M_create: deviceResp: ", deviceResp) + log.Debug("oneM2M_create: sensorResp: ", sensorResp) - return deviceResp, nil + return sensorResp, nil } -func (tm *IotMgr) oneM2M_discovery(device DeviceInfo, requestedIotPlatformId string, type_ string) (deviceResp DeviceInfo, err error) { +func (tm *SssMgr) oneM2M_discovery(sensor SensorDiscoveryInfo, requestedIotPlatformId string, type_ string) (sensorResp SensorDiscoveryInfo, err error) { // FIXME FSCOM: requestedIotPlatformId should be useless // 1. Get the list of the AE // Build the URL - t := registeredIotPlatformsMap[requestedIotPlatformId].CustomServicesTransportInfo[0] - log.Debug("oneM2M_discovery: t.Endpoint.Addresses[0]=", t.Endpoint.Addresses[0]) - url := "http://" + t.Endpoint.Addresses[0].Host + ":" + strconv.Itoa(int(t.Endpoint.Addresses[0].Port)) + "/" + t.Name + url := "http://" + registeredIotPlatformsMap[requestedIotPlatformId].Address + ":" + strconv.Itoa(int(registeredIotPlatformsMap[requestedIotPlatformId].Port)) + "/" + registeredIotPlatformsMap[requestedIotPlatformId].Name log.Debug("oneM2M_discovery: url=", url) // Build the headers var headers = http.Header{} @@ -782,22 +589,22 @@ func (tm *IotMgr) oneM2M_discovery(device DeviceInfo, requestedIotPlatformId str headers["Content-Type"] = []string{headerContentType} headers["X-M2M-Origin"] = []string{"CAdmin"} // FIXME FSCOM How to get it headers["X-M2M-RI"] = []string{uuid.New().String()} - headers["X-M2M-RVI"] = []string{t.Version} + headers["X-M2M-RVI"] = []string{"4"} // FIXME FSCOM How to get it // Build the queries queries := map[string]string{} if type_ == "CN" { queries["fu"] = "1" // Filter usage - queries["ty"] = "4" // Filter on oneM2M CIN for device + queries["ty"] = "4" // Filter on oneM2M CIN for sensor } else { err = errors.New("oneM2M_discovery: Invalid type") log.Error("oneM2M_discovery: ", err.Error()) - return deviceResp, err + return sensorResp, err } // Send the request response, err := sendRequest("GET", url, headers, nil, nil, queries, 200) if err != nil { log.Error("oneM2M_discovery: ", err.Error()) - return deviceResp, err + return sensorResp, err } log.Debug("oneM2M_discovery: response: ", string(response)) @@ -805,40 +612,31 @@ func (tm *IotMgr) oneM2M_discovery(device DeviceInfo, requestedIotPlatformId str err = json.Unmarshal(response, &d) if err != nil { log.Error("oneM2M_discovery: ", err.Error()) - return deviceResp, err + return sensorResp, err } log.Debug("oneM2M_discovery: d: ", d) // Add additional entries - deviceResp, err = tm.oneM2M_deserialize(device, d) + sensorResp, err = tm.oneM2M_deserialize(sensor, d) if err != nil { log.Error("oneM2M_discovery: ", err.Error()) - return deviceResp, err + return sensorResp, err } - // log.Debug("oneM2M_discovery: deviceResp: ", deviceResp) - return deviceResp, nil + // log.Debug("oneM2M_discovery: sensorResp: ", sensorResp) + return sensorResp, nil } -func (tm *IotMgr) oneM2M_get(device DeviceInfo, requestedIotPlatformId string, type_ string) (deviceResp DeviceInfo, err error) { +func (tm *SssMgr) oneM2M_get(sensor SensorDiscoveryInfo, requestedIotPlatformId string, type_ string) (sensorResp SensorDiscoveryInfo, err error) { // FIXME FSCOM: requestedIotPlatformId should be useless - ri := "" - for _, val := range device.DeviceMetadata { - if val.Key == "ri" { - ri = val.Value - break - } - } - if ri == "" { + if sensor.SensorIdentifier == "" { err = errors.New("oneM2M_get: Cannot find \"ri\" value") log.Error("oneM2M_get: ", err.Error()) - return deviceResp, err + return sensorResp, err } // 1. Get the list of the AE // Build the URL - t := registeredIotPlatformsMap[requestedIotPlatformId].CustomServicesTransportInfo[0] - log.Debug("oneM2M_get: t.Endpoint.Addresses[0]=", t.Endpoint.Addresses[0]) - url := "http://" + t.Endpoint.Addresses[0].Host + ":" + strconv.Itoa(int(t.Endpoint.Addresses[0].Port)) + "/" + ri + url := "http://" + registeredIotPlatformsMap[requestedIotPlatformId].Address + ":" + strconv.Itoa(int(registeredIotPlatformsMap[requestedIotPlatformId].Port)) + "/" + sensor.SensorIdentifier log.Debug("oneM2M_get: url=", url) // Build the headers var headers = http.Header{} @@ -846,24 +644,24 @@ func (tm *IotMgr) oneM2M_get(device DeviceInfo, requestedIotPlatformId string, t headers["Content-Type"] = []string{headerContentType} headers["X-M2M-Origin"] = []string{"CAdmin"} // FIXME FSCOM How to get it headers["X-M2M-RI"] = []string{uuid.New().String()} - headers["X-M2M-RVI"] = []string{t.Version} + headers["X-M2M-RVI"] = []string{"4"} // FIXME FSCOM How to get it // Build the queries queries := map[string]string{} if type_ == "AE" { queries = nil } else if type_ == "CN" { queries["fu"] = "1" // Filter usage - queries["ty"] = "4" // Filter on oneM2M CIN for device + queries["ty"] = "4" // Filter on oneM2M CIN for sensor } else { err = errors.New("oneM2M_get: Invalid type") log.Error("oneM2M_get: ", err.Error()) - return deviceResp, err + return sensorResp, err } // Send the request response, err := sendRequest("GET", url, headers, nil, nil, queries, 200) if err != nil { log.Error("oneM2M_get: ", err.Error()) - return deviceResp, err + return sensorResp, err } log.Debug("oneM2M_get: response: ", string(response)) @@ -871,40 +669,31 @@ func (tm *IotMgr) oneM2M_get(device DeviceInfo, requestedIotPlatformId string, t err = json.Unmarshal(response, &d) if err != nil { log.Error("oneM2M_get: ", err.Error()) - return deviceResp, err + return sensorResp, err } log.Debug("oneM2M_get: d: ", d) // Add additional entries - deviceResp, err = tm.oneM2M_deserialize(device, d) + sensorResp, err = tm.oneM2M_deserialize(sensor, d) if err != nil { log.Error("oneM2M_get: ", err.Error()) - return deviceResp, err + return sensorResp, err } - log.Debug("oneM2M_get: deviceResp: ", deviceResp) - return deviceResp, nil + log.Debug("oneM2M_get: sensorResp: ", sensorResp) + return sensorResp, nil } -func (tm *IotMgr) oneM2M_delete(device DeviceInfo, requestedIotPlatformId string, type_ string) (err error) { +func (tm *SssMgr) oneM2M_delete(sensor SensorDiscoveryInfo, requestedIotPlatformId string, type_ string) (err error) { // FIXME FSCOM: requestedIotPlatformId should be useless - ri := "" - for _, val := range device.DeviceMetadata { - if val.Key == "ri" { - ri = val.Value - break - } - } - if ri == "" { + if sensor.SensorIdentifier == "" { err = errors.New("oneM2M_delete: Cannot find \"ri\" value") log.Error("oneM2M_delete: ", err.Error()) return err } // Build the URL - t := registeredIotPlatformsMap[requestedIotPlatformId].CustomServicesTransportInfo[0] - log.Debug("oneM2M_delete: t.Endpoint.Addresses[0]=", t.Endpoint.Addresses[0]) - url := "http://" + t.Endpoint.Addresses[0].Host + ":" + strconv.Itoa(int(t.Endpoint.Addresses[0].Port)) + "/" + ri + url := "http://" + registeredIotPlatformsMap[requestedIotPlatformId].Address + ":" + strconv.Itoa(int(registeredIotPlatformsMap[requestedIotPlatformId].Port)) + "/" + sensor.SensorIdentifier log.Debug("oneM2M_delete: url=", url) // Build the headers var headers = http.Header{} @@ -913,7 +702,7 @@ func (tm *IotMgr) oneM2M_delete(device DeviceInfo, requestedIotPlatformId string headers["X-M2M-Origin"] = []string{"C" + requestedIotPlatformId} // FIXME FSCOM How to get it headers["X-M2M-RI"] = []string{uuid.New().String()} headers["X-M2M-RI"] = []string{uuid.New().String()} - headers["X-M2M-RVI"] = []string{t.Version} + headers["X-M2M-RVI"] = []string{"4"} // Send the request _, err = sendRequest("DELETE", url, headers, nil, nil, nil, 200) if err != nil { @@ -924,8 +713,13 @@ func (tm *IotMgr) oneM2M_delete(device DeviceInfo, requestedIotPlatformId string return nil } -func (tm *IotMgr) oneM2M_deserialize(device DeviceInfo, response map[string]map[string]interface{}) (deviceResp DeviceInfo, err error) { - deviceResp = device // Same data type +func (tm *SssMgr) oneM2M_subscribe_discovery_event(requestedIotPlatformId string) (err error) { + + return nil +} + +func (tm *SssMgr) oneM2M_deserialize(sensor SensorDiscoveryInfo, response map[string]map[string]interface{}) (sensorResp SensorDiscoveryInfo, err error) { + sensorResp = sensor // Same data structure log.Debug("oneM2M_deserialize: type(response): ", reflect.TypeOf(response)) log.Debug("oneM2M_deserialize: len(response): ", len(response)) @@ -934,7 +728,7 @@ func (tm *IotMgr) oneM2M_deserialize(device DeviceInfo, response map[string]map[ if val, ok := response["m2m:ae"]; ok { log.Debug("oneM2M_deserialize: val: ", val) } else { - log.Error("oneM2M_deserialize: Key not found") + log.Error("oneM2M_deserialize: CharacteristicName not found") } for i, m := range response { @@ -944,53 +738,76 @@ func (tm *IotMgr) oneM2M_deserialize(device DeviceInfo, response map[string]map[ for k, v := range m { log.Debug(k, " value is ", v) log.Debug("oneM2M_deserialize: type(v): ", reflect.TypeOf(v)) - if item, ok := v.(string); ok { - deviceResp.DeviceMetadata = append( - deviceResp.DeviceMetadata, - KeyValuePair{ - Key: k, - Value: string(item), - }) - } else if item, ok := v.(float64); ok { - deviceResp.DeviceMetadata = append( - deviceResp.DeviceMetadata, - KeyValuePair{ - Key: k, - Value: strconv.FormatFloat(item, 'f', -1, 64), - }) - } else if item, ok := v.(int64); ok { - deviceResp.DeviceMetadata = append( - deviceResp.DeviceMetadata, - KeyValuePair{ - Key: k, - Value: strconv.FormatInt(item, 10), - }) - } else if item, ok := v.(bool); ok { - deviceResp.DeviceMetadata = append( - deviceResp.DeviceMetadata, - KeyValuePair{ - Key: k, - Value: strconv.FormatBool(item), - }) - } else if item, ok := v.([]string); ok { - deviceResp.DeviceMetadata = append( - deviceResp.DeviceMetadata, - KeyValuePair{ - Key: k, - Value: strings.Join(item, ","), - }) - } else if item, ok := v.([]int64); ok { - log.Error("oneM2M_deserialize: Failed to convert list of int64 into string: ", item) - } else if _, ok := v.([]interface{}); ok { - log.Error("oneM2M_deserialize: Failed to convert []interface {} into string: ", v.([]interface{})) + + if k == "ri" { + if item, ok := v.(string); ok { + sensor.SensorIdentifier = item + } else { + log.Error("populateSensors: Failed to process ", k) + } + } else if k == "ty" { + if item, ok := v.(string); ok { + sensor.SensorType = item + } else { + log.Error("populateSensors: Failed to process ", k) + } } else { - log.Error("oneM2M_deserialize: Failed to process: ", k) + if item, ok := v.(string); ok { + sensorResp.SensorCharacteristicList = append( + sensorResp.SensorCharacteristicList, + SensorCharacteristic{ + CharacteristicName: k, + CharacteristicValue: string(item), + }) + } else if item, ok := v.(float64); ok { + sensorResp.SensorCharacteristicList = append( + sensorResp.SensorCharacteristicList, + SensorCharacteristic{ + CharacteristicName: k, + CharacteristicValue: strconv.FormatFloat(item, 'f', -1, 64), + }) + } else if item, ok := v.(int64); ok { + sensorResp.SensorCharacteristicList = append( + sensorResp.SensorCharacteristicList, + SensorCharacteristic{ + CharacteristicName: k, + CharacteristicValue: strconv.FormatInt(item, 10), + }) + } else if item, ok := v.(bool); ok { + sensorResp.SensorCharacteristicList = append( + sensorResp.SensorCharacteristicList, + SensorCharacteristic{ + CharacteristicName: k, + CharacteristicValue: strconv.FormatBool(item), + }) + } else if item, ok := v.([]string); ok { + sensorResp.SensorCharacteristicList = append( + sensorResp.SensorCharacteristicList, + SensorCharacteristic{ + CharacteristicName: k, + CharacteristicValue: strings.Join(item, ","), + }) + } else if item, ok := v.([]int64); ok { + log.Error("oneM2M_deserialize: Failed to convert list of int64 into string: ", item) + } else if item, ok := v.([]interface{}); ok { + log.Debug("populateSensors: Got []interface {} for ", k) + log.Debug("populateSensors: ValueOf ", reflect.ValueOf(item)) + s := SensorCharacteristic{ + CharacteristicName: k, + } + var buf bytes.Buffer + fmt.Fprintf(&buf, "%T", item) + s.CharacteristicValue = buf.String() + sensor.SensorCharacteristicList = append(sensor.SensorCharacteristicList, s) + } else { + log.Error("oneM2M_deserialize: Failed to process: ", k) + } } } // End of 'for' loop } // End of 'for' loop - return deviceResp, nil + return sensorResp, 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) { diff --git a/go-packages/meep-sss-mgr/onem2m-mgr_test.go b/go-packages/meep-sss-mgr/onem2m-mgr_test.go index fd19a4c466155ba3df8c380a5fc2b89000c34764..554ba8b26b7889c4c46915b43bf1676f01e6698e 100644 --- a/go-packages/meep-sss-mgr/onem2m-mgr_test.go +++ b/go-packages/meep-sss-mgr/onem2m-mgr_test.go @@ -14,10 +14,12 @@ * limitations under the License. */ -package onem2mmgr +package sssmgr import ( "fmt" + "math/rand" + "reflect" "testing" log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger" @@ -26,333 +28,265 @@ import ( const tmName = "meep-iot" const tmNamespace = "sandboxtest" -func TestNewIotMgr(t *testing.T) { +func TestNewSssMgr(t *testing.T) { fmt.Println("--- ", t.Name()) log.MeepTextLogInit(t.Name()) // Invalid Connector - fmt.Println("Invalid IOT Asset Manager") - tm, err := NewIotMgr("", tmNamespace) + fmt.Println("Invalid SSS Asset Manager") + tm, err := NewSssMgr("", tmNamespace, nil, nil, nil) if err == nil || tm != nil { t.Fatalf("DB connection should have failed") } // Valid Connector - fmt.Println("Create valid IOT Asset Manager") - tm, err = NewIotMgr(tmName, tmNamespace) + fmt.Println("Create valid SSS Asset Manager") + tm, err = NewSssMgr(tmName, tmNamespace, nil, nil, nil) if err != nil || tm == nil { - t.Fatalf("Failed to create IOT Asset Manager") + t.Fatalf("Failed to create SSS Asset Manager") } // Cleanup - err = tm.DeleteIotMgr() + err = tm.DeleteSssMgr() if err != nil { - t.Fatalf("Failed to cleanup IOT Asset Manager") + t.Fatalf("Failed to cleanup SSS Asset Manager") } } -func TestRegisterIotPlatformInfo(t *testing.T) { +func TestPopulateDevicesPerIotPlatforms(t *testing.T) { fmt.Println("--- ", t.Name()) log.MeepTextLogInit(t.Name()) // Valid Connector - fmt.Println("Create valid IOT Asset Manager") - tm, err := NewIotMgr(tmName, tmNamespace) + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, nil, nil, nil) if err != nil || tm == nil { - t.Fatalf("Failed to create IOT Asset Manager") + t.Fatalf("Failed to create SSS Asset Manager") } - // Set a valid platform - var adresses = []Addresses{} - adresses = append(adresses, Addresses{ - Host: "172.29.10.56", - Port: 1883, - }) - var endpoint = EndPointInfo{ - Addresses: adresses, - } - var userTransportInfo = []MbTransportInfo{} - userTransportInfo = append(userTransportInfo, MbTransportInfo{ - Id: "d5673793-c55c-4969-b5bc-2121f84b9f8d", - Name: "MQTT", - Description: "MQTT", - Protocol: "MQTT", - Version: "2", - Endpoint: &endpoint, - }) - var adresses_1 = []Addresses{} - adresses_1 = append(adresses_1, Addresses{ - Host: "172.29.10.20", - Port: 31110, - }) - var customServicesTransportInfo = []TransportInfo{} - var endPointInfo_1 = EndPointInfo{ - Addresses: adresses_1, - } - customServicesTransportInfo = append(customServicesTransportInfo, TransportInfo{ - Id: "2ddb713c-2b41-4ded-a7ad-a5a047c5df13", - Name: "/laboai-acme-ic-cse", - Description: "ACME oneM2M CSE", - Protocol: "REST_HTTP", - Version: "4", - Endpoint: &endPointInfo_1, - }) - var iotPlatformInfo = IotPlatformInfo{ - IotPlatformId: "523f2df1-8927-429f-906c-56ba92d13762", - UserTransportInfo: userTransportInfo, - CustomServicesTransportInfo: customServicesTransportInfo, - Enabled: true, - } - fmt.Println("Create an IotPlatformInfo: ", iotPlatformInfo) - err = tm.RegisterIotPlatformInfo(iotPlatformInfo) + err = tm.populateDevicesPerIotPlatforms() if err != nil { - t.Fatalf("Failed to register new IoT platform") + t.Fatalf(err.Error()) } // Cleanup - err = tm.DeregisterIotPlatformInfo(iotPlatformInfo.IotPlatformId) - if err != nil { - t.Fatalf("Failed to register new IoT platform") - } - err = tm.DeleteIotMgr() + err = tm.DeleteSssMgr() if err != nil { - t.Fatalf("Failed to cleanup IOT Asset Manager") + t.Fatalf("Failed to cleanup SSS Asset Manager") } - - // t.Fatalf("DONE") } -func TestOneM2mCreateAE(t *testing.T) { +func TestSensorDiscoveryInfoAll(t *testing.T) { fmt.Println("--- ", t.Name()) log.MeepTextLogInit(t.Name()) // Valid Connector - fmt.Println("Create valid IOT Asset Manager") - tm, err := NewIotMgr(tmName, tmNamespace) + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, nil, nil, nil) if err != nil || tm == nil { - t.Fatalf("Failed to create IOT Asset Manager") + t.Fatalf("Failed to create SSS Asset Manager") } - // Set a valid platform - var adresses = []Addresses{} - adresses = append(adresses, Addresses{ - Host: "172.29.10.56", - Port: 1883, - }) - var endpoint = EndPointInfo{ - Addresses: adresses, - } - var userTransportInfo = []MbTransportInfo{} - userTransportInfo = append(userTransportInfo, MbTransportInfo{ - Id: "d5673793-c55c-4969-b5bc-2121f84b9f8d", - Name: "MQTT", - Description: "MQTT", - Protocol: "MQTT", - Version: "2", - Endpoint: &endpoint, - }) - var adresses_1 = []Addresses{} - adresses_1 = append(adresses_1, Addresses{ - Host: "172.29.10.20", - Port: 31110, - }) - var customServicesTransportInfo = []TransportInfo{} - var endPointInfo_1 = EndPointInfo{ - Addresses: adresses_1, - } - customServicesTransportInfo = append(customServicesTransportInfo, TransportInfo{ - Id: "2ddb713c-2b41-4ded-a7ad-a5a047c5df13", - Name: "/laboai-acme-ic-cse", - Description: "ACME oneM2M CSE", - Protocol: "REST_HTTP", - Version: "4", - Endpoint: &endPointInfo_1, - }) - var iotPlatformInfo = IotPlatformInfo{ - IotPlatformId: "523f2df1-8927-429f-906c-56ba92d13762", - UserTransportInfo: userTransportInfo, - CustomServicesTransportInfo: customServicesTransportInfo, - Enabled: true, - } - // Create a new IotPlatformInfo - fmt.Println("Create a new IotPlatformInfo") - err = tm.RegisterIotPlatformInfo(iotPlatformInfo) + err = tm.populateDevicesPerIotPlatforms() if err != nil { - t.Fatalf("Failed to register new IoT platform") - } - // Create an AE for this new IotPlatform - fmt.Println("Create an AE for this new IotPlatform") - requestedIotPlatformId := iotPlatformInfo.IotPlatformId - var device = DeviceInfo{ - RequestedIotPlatformId: requestedIotPlatformId, - DeviceId: requestedIotPlatformId, - Enabled: true, - } - deviceResp, err := tm.oneM2M_create(device, requestedIotPlatformId, "AE") - if err != nil { - t.Fatalf("oneM2M_create failure") - } - fmt.Println("deviceResp: ", deviceResp) - // Get the new IotPlatform entry - fmt.Println("Get the new IotPlatform entry") - deviceResp_1, err := tm.oneM2M_get(deviceResp, requestedIotPlatformId, "AE") - if err != nil { - t.Fatalf("oneM2M_get failure") + t.Fatalf(err.Error()) } - // Check deviceResp vs. deviceResp_1 - if !validate_device_info(deviceResp, deviceResp_1) { - t.Fatalf("validate_device_info failure") - } - - // Delete the new IotPlatform entry - fmt.Println("Delete the new IotPlatform entry") - err = tm.oneM2M_delete(deviceResp, requestedIotPlatformId, "AE") + sensors, err := tm.SensorDiscoveryInfoAll() if err != nil { - t.Fatalf("oneM2M_create failure") + t.Fatalf(err.Error()) } + fmt.Println("sensors: ", sensors) // Cleanup - err = tm.DeleteIotMgr() + err = tm.DeleteSssMgr() if err != nil { - t.Fatalf("Failed to cleanup IOT Asset Manager") + t.Fatalf("Failed to cleanup SSS Asset Manager") } - - // t.Fatalf("DONE") } -func TestOneM2mCreateAEAndCNT(t *testing.T) { +func TestGetSensor(t *testing.T) { fmt.Println("--- ", t.Name()) log.MeepTextLogInit(t.Name()) // Valid Connector - fmt.Println("Create valid IOT Asset Manager") - tm, err := NewIotMgr(tmName, tmNamespace) + fmt.Println("Create valid SSS Asset Manager") + tm, err := NewSssMgr(tmName, tmNamespace, nil, nil, nil) if err != nil || tm == nil { - t.Fatalf("Failed to create IOT Asset Manager") + t.Fatalf("Failed to create SSS Asset Manager") } - // Register new IotPlatform and create AE entry - fmt.Println("Register new IotPlatform and create AE entry") - iotPlatformInfo, err := registerIotPltfAndCreateAE(tm) - if err != nil { - t.Fatalf("registerIotPltfAndCreateAE failure") - } - // Get the new IotPlatform and create AE entry - fmt.Println("Get the new IotPlatform and create AE entry") - deviceResp_1, err := tm.oneM2M_get(*iotPlatformInfo.DeviceInfo, iotPlatformInfo.IotPlatformId, "AE") + err = tm.populateDevicesPerIotPlatforms() if err != nil { - t.Fatalf("oneM2M_get failure") - } - // Check deviceResp vs. deviceResp_1 - fmt.Println("Check deviceResp vs. deviceResp_1") - if !validate_device_info(*iotPlatformInfo.DeviceInfo, deviceResp_1) { - t.Fatalf("validate_device_info failure") + t.Fatalf(err.Error()) } - // Create a device for the IotPlatform - var device = DeviceInfo{ - RequestedIotPlatformId: iotPlatformInfo.IotPlatformId, - DeviceId: "Device1", - Enabled: true, - //DeviceMetadata: [KeyValuePair{Key: "pi", Value: *iotPlatformInfo.DeviceInfo.DeviceMetadata[]}] - } - device, err = tm.oneM2M_create(device, iotPlatformInfo.IotPlatformId, "CNT") + sensors, err := tm.SensorDiscoveryInfoAll() if err != nil { - t.Fatalf("oneM2M_create failed to create a device") + t.Fatalf(err.Error()) } - fmt.Println("device: ", device) + fmt.Println("sensors: ", sensors) - // Delete the new IotPlatform entry - fmt.Println("Delete the new IotPlatform entry") - err = tm.oneM2M_delete(*iotPlatformInfo.DeviceInfo, iotPlatformInfo.IotPlatformId, "AE") + idx := rand.Int31n(int32(len(sensors))) + sensor, err := tm.GetSensor(sensors[idx].SensorIdentifier) if err != nil { - t.Fatalf("oneM2M_create failure") + t.Fatalf(err.Error()) + } + fmt.Println("sensor: ", sensor) + if !validate_sensor_discovery_info(sensors[idx], sensor) { + t.Fatalf("Value mismatch") } // Cleanup - err = tm.DeleteIotMgr() + err = tm.DeleteSssMgr() if err != nil { - t.Fatalf("Failed to cleanup IOT Asset Manager") + t.Fatalf("Failed to cleanup SSS Asset Manager") } - - // t.Fatalf("DONE") } -func registerIotPltfAndCreateAE(tm *IotMgr) (iotPlatformInfo IotPlatformInfo, err error) { - - // Set a valid platform - var adresses = []Addresses{} - adresses = append(adresses, Addresses{ - Host: "172.29.10.56", - Port: 1883, - }) - var endpoint = EndPointInfo{ - Addresses: adresses, - } - var userTransportInfo = []MbTransportInfo{} - userTransportInfo = append(userTransportInfo, MbTransportInfo{ - Id: "d5673793-c55c-4969-b5bc-2121f84b9f8d", - Name: "MQTT", - Description: "MQTT", - Protocol: "MQTT", - Version: "2", - Endpoint: &endpoint, - }) - var adresses_1 = []Addresses{} - adresses_1 = append(adresses_1, Addresses{ - Host: "172.29.10.20", - Port: 31110, - }) - var customServicesTransportInfo = []TransportInfo{} - var endPointInfo_1 = EndPointInfo{ - Addresses: adresses_1, - } - customServicesTransportInfo = append(customServicesTransportInfo, TransportInfo{ - Id: "2ddb713c-2b41-4ded-a7ad-a5a047c5df13", - Name: "/laboai-acme-ic-cse", - Description: "ACME oneM2M CSE", - Protocol: "REST_HTTP", - Version: "4", - Endpoint: &endPointInfo_1, - }) - iotPlatformInfo = IotPlatformInfo{ - IotPlatformId: "523f2df1-8927-429f-906c-56ba92d13762", - UserTransportInfo: userTransportInfo, - CustomServicesTransportInfo: customServicesTransportInfo, - Enabled: true, - } - err = tm.RegisterIotPlatformInfo(iotPlatformInfo) - if err != nil { - return iotPlatformInfo, err - } - - // OneM2M create MEC pltf as an AE - requestedIotPlatformId := iotPlatformInfo.IotPlatformId - var device = DeviceInfo{ - RequestedIotPlatformId: requestedIotPlatformId, - DeviceId: requestedIotPlatformId, - Enabled: true, - } - d, err := tm.oneM2M_create(device, requestedIotPlatformId, "AE") - if err != nil { - return iotPlatformInfo, err +// func TestOneM2mCreateAEAndCNT(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, nil, nil, nil) +// if err != nil || tm == nil { +// t.Fatalf("Failed to create SSS Asset Manager") +// } + +// // Register new IotPlatform and create AE entry +// fmt.Println("Register new IotPlatform and create AE entry") +// iotPlatformInfo, err := registerIotPltfAndCreateAE(tm) +// if err != nil { +// t.Fatalf("registerIotPltfAndCreateAE failure") +// } +// // Get the new IotPlatform and create AE entry +// fmt.Println("Get the new IotPlatform and create AE entry") +// deviceResp_1, err := tm.oneM2M_get(*iotPlatformInfo.DeviceInfo, iotPlatformInfo.IotPlatformId, "AE") +// if err != nil { +// t.Fatalf("oneM2M_get failure") +// } +// // Check deviceResp vs. deviceResp_1 +// fmt.Println("Check deviceResp vs. deviceResp_1") +// if !validate_device_info(*iotPlatformInfo.DeviceInfo, deviceResp_1) { +// t.Fatalf("validate_device_info failure") +// } + +// // Create a device for the IotPlatform +// var device = DeviceInfo{ +// RequestedIotPlatformId: iotPlatformInfo.IotPlatformId, +// SensorIdentifier: "Device1", +// Enabled: true, +// //DeviceMetadata: [KeyValuePair{Key: "pi", Value: *iotPlatformInfo.DeviceInfo.DeviceMetadata[]}] +// } +// device, err = tm.oneM2M_create(device, iotPlatformInfo.IotPlatformId, "CNT") +// if err != nil { +// t.Fatalf("oneM2M_create failed to create a device") +// } +// fmt.Println("device: ", device) + +// // Delete the new IotPlatform entry +// fmt.Println("Delete the new IotPlatform entry") +// err = tm.oneM2M_delete(*iotPlatformInfo.DeviceInfo, iotPlatformInfo.IotPlatformId, "AE") +// if err != nil { +// t.Fatalf("oneM2M_create failure") +// } + +// // Cleanup +// err = tm.DeleteSssMgr() +// if err != nil { +// t.Fatalf("Failed to cleanup SSS Asset Manager") +// } + +// // t.Fatalf("DONE") +// } + +// func registerIotPltfAndCreateAE(tm *SssMgr) (iotPlatformInfo IotPlatformInfo, err error) { + +// // Set a valid platform +// var adresses = []Addresses{} +// adresses = append(adresses, Addresses{ +// Host: "172.29.10.56", +// Port: 1883, +// }) +// var endpoint = EndPointInfo{ +// Addresses: adresses, +// } +// var userTransportInfo = []MbTransportInfo{} +// userTransportInfo = append(userTransportInfo, MbTransportInfo{ +// Id: "d5673793-c55c-4969-b5bc-2121f84b9f8d", +// Name: "MQTT", +// Description: "MQTT", +// Protocol: "MQTT", +// Version: "2", +// Endpoint: &endpoint, +// }) +// var adresses_1 = []Addresses{} +// adresses_1 = append(adresses_1, Addresses{ +// Host: "172.29.10.20", +// Port: 31110, +// }) +// var customServicesTransportInfo = []TransportInfo{} +// var endPointInfo_1 = EndPointInfo{ +// Addresses: adresses_1, +// } +// customServicesTransportInfo = append(customServicesTransportInfo, TransportInfo{ +// Id: "2ddb713c-2b41-4ded-a7ad-a5a047c5df13", +// Name: "/laboai-acme-ic-cse", +// Description: "ACME oneM2M CSE", +// Protocol: "REST_HTTP", +// Version: "4", +// Endpoint: &endPointInfo_1, +// }) +// iotPlatformInfo = IotPlatformInfo{ +// IotPlatformId: "523f2df1-8927-429f-906c-56ba92d13762", +// UserTransportInfo: userTransportInfo, +// CustomServicesTransportInfo: customServicesTransportInfo, +// Enabled: true, +// } +// err = tm.RegisterIotPlatformInfo(iotPlatformInfo) +// if err != nil { +// return iotPlatformInfo, err +// } + +// // OneM2M create MEC pltf as an AE +// requestedIotPlatformId := iotPlatformInfo.IotPlatformId +// var device = DeviceInfo{ +// RequestedIotPlatformId: requestedIotPlatformId, +// SensorIdentifier: requestedIotPlatformId, +// Enabled: true, +// } +// d, err := tm.oneM2M_create(device, requestedIotPlatformId, "AE") +// if err != nil { +// return iotPlatformInfo, err +// } +// iotPlatformInfo.DeviceInfo = new(DeviceInfo) +// *iotPlatformInfo.DeviceInfo = d +// fmt.Println("iotPlatformInfo.DeviceInfo: ", *iotPlatformInfo.DeviceInfo) + +// return iotPlatformInfo, nil +// } + +func validate_sensor_discovery_info(expected_sensor SensorDiscoveryInfo, received_sensor SensorDiscoveryInfo) bool { + fmt.Println(">>> validate_sensor_discovery_info: expected_sensor: ", expected_sensor) + fmt.Println(">>> validate_sensor_discovery_info: received_sensor: ", received_sensor) + + if expected_sensor.SensorIdentifier != received_sensor.SensorIdentifier { + fmt.Println("received_sensor.SensorIdentifier != SensorIdentifier") + return false } - iotPlatformInfo.DeviceInfo = new(DeviceInfo) - *iotPlatformInfo.DeviceInfo = d - fmt.Println("iotPlatformInfo.DeviceInfo: ", *iotPlatformInfo.DeviceInfo) - - return iotPlatformInfo, nil -} - -func validate_device_info(expected_device DeviceInfo, received_deviceResp DeviceInfo) bool { - if expected_device.DeviceId != received_deviceResp.DeviceId { - fmt.Println(" received_deviceResp.DeviceId != DeviceId") + if len(expected_sensor.SensorPropertyList) != len(received_sensor.SensorPropertyList) { + fmt.Println("len(received_sensor.SensorPropertyList) != len(SensorPropertyList)") return false + } else if !reflect.DeepEqual(expected_sensor.SensorPropertyList, received_sensor.SensorPropertyList) { + fmt.Println("received_sensor.SensorPropertyList != SensorPropertyList") } - if expected_device.Enabled != received_deviceResp.Enabled { - fmt.Println(" received_deviceResp.Enabled != Enabled") + if len(expected_sensor.SensorCharacteristicList) != len(received_sensor.SensorCharacteristicList) { + fmt.Println("len(received_sensor.SensorCharacteristicList) != len(SensorCharacteristicList)") return false + } else if !reflect.DeepEqual(expected_sensor.SensorCharacteristicList, received_sensor.SensorCharacteristicList) { + fmt.Println("received_sensor.SensorCharacteristicList != SensorCharacteristicList") } // TODO To be continued