summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author차지원/Service Innovation Lab(SR)/Engineer/삼성전자 <jw_wonny.cha@samsung.com>2019-04-02 15:11:54 +0900
committerGitHub Enterprise <noreply-CODE@samsung.com>2019-04-02 15:11:54 +0900
commitbc03f86bba4fd3e3e8e17b624c4bca54bb49fd18 (patch)
tree5c326364d6990e46aba8a930a96962921a5e7ad0
parent8abc561b4a71caa6f378aa6fe94d40aa7219a953 (diff)
parentc1f3d2546a821552085575f5459900830f0db26d (diff)
downloadedge-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.go78
-rw-r--r--src/discoverymgr/discovery_init.go71
-rw-r--r--src/discoverymgr/discovery_setTXT.go55
-rw-r--r--src/discoverymgr/discoverymgr_test.go80
-rw-r--r--src/restapi/v1/restapi.go48
-rw-r--r--src/restapi/v1/restapi_test.go4
-rw-r--r--src/restapi/v1/routers.go14
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",