diff options
author | 차지원/Service Innovation Lab(SR)/Engineer/삼성전자 <jw_wonny.cha@samsung.com> | 2019-04-02 15:11:54 +0900 |
---|---|---|
committer | GitHub Enterprise <noreply-CODE@samsung.com> | 2019-04-02 15:11:54 +0900 |
commit | bc03f86bba4fd3e3e8e17b624c4bca54bb49fd18 (patch) | |
tree | 5c326364d6990e46aba8a930a96962921a5e7ad0 | |
parent | 8abc561b4a71caa6f378aa6fe94d40aa7219a953 (diff) | |
parent | c1f3d2546a821552085575f5459900830f0db26d (diff) | |
download | edge-orchestration-EDGE-301.tar.gz edge-orchestration-EDGE-301.tar.bz2 edge-orchestration-EDGE-301.zip |
Merge branch 'master' into EDGE-301EDGE-301
-rw-r--r-- | src/discoverymgr/discovery_execution.go | 78 | ||||
-rw-r--r-- | src/discoverymgr/discovery_init.go | 71 | ||||
-rw-r--r-- | src/discoverymgr/discovery_setTXT.go | 55 | ||||
-rw-r--r-- | src/discoverymgr/discoverymgr_test.go | 80 | ||||
-rw-r--r-- | src/restapi/v1/restapi.go | 48 | ||||
-rw-r--r-- | src/restapi/v1/restapi_test.go | 4 | ||||
-rw-r--r-- | src/restapi/v1/routers.go | 14 |
7 files changed, 284 insertions, 66 deletions
diff --git a/src/discoverymgr/discovery_execution.go b/src/discoverymgr/discovery_execution.go new file mode 100644 index 0000000..615c72b --- /dev/null +++ b/src/discoverymgr/discovery_execution.go @@ -0,0 +1,78 @@ +package discoverymgr + +import ( + "context" + "log" + "time" + + "github.com/grandcat/zeroconf" +) + +//GetDeviceList retune device list +func GetDeviceList() ([]DeviceReturnInfo, error) { + data, err := discoverDevice() + if err != nil { + return nil, err + } + var ret []DeviceReturnInfo + for key, value := range data { + ret = append(ret, DeviceReturnInfo{ + DeviceIP: key, + ServiceNames: value}) + } + + return ret, nil +} + +//GetDeviceListWithService retune device list +func GetDeviceListWithService(target string) ([]string, error) { + data, err := discoverDevice() + if err != nil { + return nil, err + } + var ret []string + for key, value := range data { + //서비스명으로검색 + for _, val := range value { + if val == target { + ret = append(ret, key) + } + } + } + //return nothing인 경우? + + return ret, nil +} + +func discoverDevice() (map[string][]string, error) { + domain := "local" + + resolver, err := zeroconf.NewResolver(nil) + if err != nil { + return nil, err + } + + var data = make(map[string][]string) //data[deviceIP][[]ServiceNames] + entries := make(chan *zeroconf.ServiceEntry) + go func(results <-chan *zeroconf.ServiceEntry) { + for entry := range results { + deviceIP := entry.AddrIPv4[0].String() + log.Println("[Discoverymgr] Discoverd Device::" + deviceIP) + ServiceNames := make([]string, len(entry.Text)) + + ServiceNames = entry.Text + + data[deviceIP] = ServiceNames + } + }(entries) + + ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*time.Duration(100)) + defer cancel() + err = resolver.Browse(ctx, serviceType, domain, entries) + if err != nil { + return nil, err + } + <-ctx.Done() + + return data, nil +} diff --git a/src/discoverymgr/discovery_init.go b/src/discoverymgr/discovery_init.go index fe4ca1e..c2433c1 100644 --- a/src/discoverymgr/discovery_init.go +++ b/src/discoverymgr/discovery_init.go @@ -1,30 +1,14 @@ package discoverymgr import ( - "context" "fmt" "log" - "time" "github.com/grandcat/zeroconf" ) var gServer *zeroconf.Server -//SetServiceNames set txt of mdns message -func SetServiceNames(ServiceNames []string) { - - var TXTSize int - for _, str := range ServiceNames { - TXTSize += len(str) - } - if TXTSize > maxTXTSize { - fmt.Println("TXT Size is Too much for mDNS TXT - 400B") - return - } - gServer.SetText(ServiceNames) -} - func registerDevice(ServiceNames []string, ret chan error) { server, err := zeroconf.Register(serviceName, serviceType, domain, servicePort, ServiceNames, nil) if err != nil { @@ -44,57 +28,18 @@ func registerDevice(ServiceNames []string, ret chan error) { } } -//DeviceList retune device list -func DeviceList() ([]DeviceReturnInfo, error) { - domain := "local" - - resolver, err := zeroconf.NewResolver(nil) - if err != nil { - return nil, err - } - - var data = make(map[string][]string) //data[deviceIP][[]ServiceNames] - entries := make(chan *zeroconf.ServiceEntry) - go func(results <-chan *zeroconf.ServiceEntry) { - for entry := range results { - deviceIP := entry.AddrIPv4[0].String() - fmt.Println("[Discoverymgr] Discoverd Device::" + deviceIP) - ServiceNames := make([]string, len(entry.Text)) - - ServiceNames = entry.Text - - data[deviceIP] = ServiceNames - } - }(entries) - - ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*time.Duration(100)) - defer cancel() - err = resolver.Browse(ctx, serviceType, domain, entries) - if err != nil { - return nil, err - } - <-ctx.Done() - - var ret []DeviceReturnInfo - for key, value := range data { - ret = append(ret, DeviceReturnInfo{ - DeviceIP: key, - ServiceNames: value}) - } - - return ret, nil -} - //InitDiscovery deploy Orchestration service -func InitDiscovery() { +func InitDiscovery() error { registerCh := make(chan error) - //@ToDo []sting Will be retrieved from configuremgr - //setServiceNames(ServiceNames) - ServiceNames := []string{"Distributed Web Engine", "Television", "Soundbox"} - go registerDevice(ServiceNames, registerCh) - if err := <-registerCh; err != nil { + go registerDevice(nil, registerCh) + err := <-registerCh + if err != nil { log.Println("[Fail] " + err.Error()) } + ResetServiceName() + + return err + } diff --git a/src/discoverymgr/discovery_setTXT.go b/src/discoverymgr/discovery_setTXT.go new file mode 100644 index 0000000..633a2d2 --- /dev/null +++ b/src/discoverymgr/discovery_setTXT.go @@ -0,0 +1,55 @@ +package discoverymgr + +import ( + confdescription "configuremgr/description" + "errors" +) + +var serverTXT []string + +//ResetServiceName will reset txt of mdns message +func ResetServiceName() error { + serverTXT = nil + return SetServiceNames("") +} + +//AddNewServiceName add servicename to orchestration server +func AddNewServiceName(doc *confdescription.Doc) error { + + newService := doc.ServiceInfo.ServiceName + if newService == "" { + return errors.New("no argument") + } + if gServer == nil { + return errors.New("Orchestration is not Exist") + } + return SetServiceNames(newService) +} + +//SetServiceNames set txt of mdns message +func SetServiceNames(newService string) error { + + if newService == "" { + gServer.SetText(serverTXT) + return nil + } + + for _, str := range serverTXT { + if str == newService { + return errors.New("ServiceName Duplicated") + } + } + serverTXT = append(serverTXT, newService) + + var TXTSize int + for _, str := range serverTXT { + TXTSize += len(str) + } + if TXTSize > maxTXTSize { + return errors.New("TXT Size is Too much for mDNS TXT - 400B") + } + + gServer.SetText(serverTXT) + + return nil +} diff --git a/src/discoverymgr/discoverymgr_test.go b/src/discoverymgr/discoverymgr_test.go new file mode 100644 index 0000000..18a0379 --- /dev/null +++ b/src/discoverymgr/discoverymgr_test.go @@ -0,0 +1,80 @@ +package discoverymgr + +import ( + confdescription "configuremgr/description" + "net" + "os" + "testing" +) + +//@Todo os dependency check +func getIP() string { + addrs, err := net.InterfaceAddrs() + if err != nil { + os.Stderr.WriteString("Oops: " + err.Error() + "\n") + os.Exit(1) + } + var ipv4 string + for _, a := range addrs { + if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { + if ipnet.IP.To4() != nil { + if ipnet.IP.String()[:2] == "10" { + os.Stdout.WriteString(ipnet.IP.String() + "\n") + ipv4 = ipnet.IP.String() + break + } + + } + } + } + return ipv4 +} +func TestGetDeviceListWithService(t *testing.T) { + err := InitDiscovery() + if err != nil { + t.Fail() + } + doc := new(confdescription.Doc) + doc.ServiceInfo.ServiceName = "test1" + err = AddNewServiceName(doc) + if err != nil { + t.Fail() + } + + ret, err := GetDeviceListWithService(doc.ServiceInfo.ServiceName) + if err != nil { + t.Fail() + } + + ipv4 := getIP() + for _, v := range ret { + if v == ipv4 { + return + } + } + t.Fail() +} +func TestGetDeviceList(t *testing.T) { + err := InitDiscovery() + if err != nil { + t.Fail() + } + + ret, err := GetDeviceList() + if err != nil { + t.Fail() + } + + ipv4 := getIP() + isExist := -1 + for i, v := range ret { + if v.DeviceIP == ipv4 { + isExist = i + } + } + + if isExist == -1 { + t.Error("no device") + t.Fail() + } +} diff --git a/src/restapi/v1/restapi.go b/src/restapi/v1/restapi.go index fc3c1ca..cb2472f 100644 --- a/src/restapi/v1/restapi.go +++ b/src/restapi/v1/restapi.go @@ -69,9 +69,10 @@ func APIV1DiscoverymgrDevicesDeviceIDGet(w http.ResponseWriter, r *http.Request) // APIV1DiscoverymgrDevicesGet function func APIV1DiscoverymgrDevicesGet(w http.ResponseWriter, r *http.Request) { log.Printf("[%s] APIV1DiscoverymgrDevicesGet", logPrefix) - ret, err := discoverymgr.DeviceList() + ret, err := discoverymgr.GetDeviceList() if err != nil { writeJSONResponse(w, nil, http.StatusBadRequest) + return } json, err := json.Marshal(ret) @@ -82,6 +83,51 @@ func APIV1DiscoverymgrDevicesGet(w http.ResponseWriter, r *http.Request) { } } +// APIV1DiscoverymgrDevicesPost function +func APIV1DiscoverymgrDevicesPost(w http.ResponseWriter, r *http.Request) { + log.Printf("[%s] APIV1DiscoverymgrDevicesPost", logPrefix) + + var distService map[string]string + decoder := json.NewDecoder(r.Body) + err := decoder.Decode(&distService) + if err != nil { + return + } + target := distService["ServiceName"] + + ret, err := discoverymgr.GetDeviceListWithService(target) + if err != nil { + writeJSONResponse(w, nil, http.StatusBadRequest) + return + } + json, err := json.Marshal(ret) + if err == nil { + writeJSONResponse(w, json, http.StatusOK) + } else { + writeJSONResponse(w, nil, http.StatusBadRequest) + } +} + +// APIV1DiscoverymgrDevicesTXTPost function +func APIV1DiscoverymgrDevicesTXTPost(w http.ResponseWriter, r *http.Request) { + log.Printf("[%s] APIV1DiscoverymgrDevicesTXTPost", logPrefix) + + var distService map[string]string + decoder := json.NewDecoder(r.Body) + err := decoder.Decode(&distService) + if err != nil { + return + } + target := distService["ServiceName"] + + err = discoverymgr.SetServiceNames(target) + if err != nil { + writeJSONResponse(w, nil, http.StatusBadRequest) + } else { + writeJSONResponse(w, nil, http.StatusOK) + } +} + // APIV1ServicemgrServicesDelete function func APIV1ServicemgrServicesDelete(w http.ResponseWriter, r *http.Request) { log.Printf("[%s] APIV1ServicemgrServicesDelete", logPrefix) diff --git a/src/restapi/v1/restapi_test.go b/src/restapi/v1/restapi_test.go index 178bf06..dfcd190 100644 --- a/src/restapi/v1/restapi_test.go +++ b/src/restapi/v1/restapi_test.go @@ -28,7 +28,7 @@ const ( ConstDeviceResourceUsageNetworkGet = "/api/v1/device/resource/usage/network" // discovery mgr URI - ConstDiscoverymgrDevices = "/api/v1/discoverymgr/devices" + ConstDiscoverymgrDevicesGet = "/api/v1/discoverymgr/devices" // Service mgr URI ConstServicemgrServices = "/api/v1/servicemgr/services" @@ -227,7 +227,7 @@ func TestAPIV1DeviceResourceUsageNetworkGet(t *testing.T) { } func TestAPIV1DiscoverymgrDevicesGet(t *testing.T) { - targetURI := ConstDiscoverymgrDevices + targetURI := ConstDiscoverymgrDevicesGet testGet(t, targetURI, http.StatusOK) } diff --git a/src/restapi/v1/routers.go b/src/restapi/v1/routers.go index cfddada..c81bacc 100644 --- a/src/restapi/v1/routers.go +++ b/src/restapi/v1/routers.go @@ -102,6 +102,20 @@ var routes = Routes{ }, Route{ + "APIV1DiscoverymgrDevicesPost", + strings.ToUpper("Post"), + "/api/v1/discoverymgr/devices", + APIV1DiscoverymgrDevicesPost, + }, + + Route{ + "APIV1DiscoverymgrDevicesTXTPost", + strings.ToUpper("Post"), + "/api/v1/discoverymgr/devices/TXT", + APIV1DiscoverymgrDevicesTXTPost, + }, + + Route{ "APIV1ServicemgrServicesPost", strings.ToUpper("Post"), "/api/v1/servicemgr/services", |