Run unit tests

Change-Id: Ia28ec0495aaa8684ba037e36fc09b2c69322d5ef
Signed-off-by: Mohamed Abukar <abukar.mohamed@nokia.com>
diff --git a/Dockerfile b/Dockerfile
index 027e372..ef526e8 100755
--- a/Dockerfile
+++ b/Dockerfile
@@ -52,13 +52,18 @@
 # build and test
 COPY . /go/src/ws
 
+# Generate Swagger code
 RUN /go/bin/swagger generate server -f api/appmgr_rest_api.yaml --name AppManager -t pkg/ --exclude-main
 
 COPY . /go/src/ws
 
-RUN make -C /go/src/ws go-build
+# Build the code
+RUN GO111MODULE=on GO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o /go/src/ws/cache/go/cmd/appmgr cmd/appmgr.go
 
-RUN make -C /go/src/ws go-test-fmt
+# Run unit tests
+RUN GO111MODULE=on GO_ENABLED=0 GOOS=linux go test -p 1 -cover ./pkg/cm/ ./pkg/helm/ ./pkg/resthooks/
+
+RUN gofmt -l $(find cmd/ pkg/  -name '*.go' -not -name '*_test.go')
 
 CMD ["/bin/bash"]
 
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 7a8aeca..0000000
--- a/Makefile
+++ /dev/null
@@ -1,41 +0,0 @@
-
-#   Copyright (c) 2019 AT&T Intellectual Property.
-#   Copyright (c) 2019 Nokia.
-#
-#   Licensed under the Apache License, Version 2.0 (the "License");
-#   you may not use this file except in compliance with the License.
-#   You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
-
-.DEFAULT: go-build
-
-default: go-build
-
-build: go-build
-
-test: go-test
-
-#------------------------------------------------------------------------------
-#
-#------------------------------------------------------------------------------
-ROOT_DIR:=$(dir $(abspath $(lastword $(MAKEFILE_LIST))))
-CACHE_DIR?=$(abspath $(ROOT_DIR)/cache)
-
-#------------------------------------------------------------------------------
-#
-# Build and test targets
-#
-#------------------------------------------------------------------------------
-
-XAPP_NAME:=appmgr
-XAPP_ROOT:=cmd
-XAPP_TESTENV:="RMR_SEED_RT=config/uta_rtg.rt CFG_FILE=$(ROOT_DIR)helm_chart/uemgr/descriptors/config-file.json"
-include build/make.go.mk 
-
diff --git a/build/make.go.mk b/build/make.go.mk
deleted file mode 100755
index 2208487..0000000
--- a/build/make.go.mk
+++ /dev/null
@@ -1,116 +0,0 @@
-#   Copyright (c) 2019 AT&T Intellectual Property.
-#   Copyright (c) 2019 Nokia.
-#
-#   Licensed under the Apache License, Version 2.0 (the "License");
-#   you may not use this file except in compliance with the License.
-#   You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
-
-
-#------------------------------------------------------------------------------
-#
-#------------------------------------------------------------------------------
-ifndef ROOT_DIR
-$(error ROOT_DIR NOT DEFINED)
-endif
-ifndef CACHE_DIR
-$(error CACHE_DIR NOT DEFINED)
-endif
-
-#------------------------------------------------------------------------------
-#
-#------------------------------------------------------------------------------
-
-GO_CACHE_DIR?=$(abspath $(CACHE_DIR)/go)
-
-#------------------------------------------------------------------------------
-#
-#------------------------------------------------------------------------------
-ifndef MAKE_GO_TARGETS
-MAKE_GO_TARGETS:=1
-
-
-.PHONY: FORCE go-build go-test go-test-fmt go-fmt go-clean
- 
-FORCE:
-
-
-GOOS=$(shell go env GOOS)
-GOCMD=go
-GOBUILD=$(GOCMD) build -a -installsuffix cgo
-GORUN=$(GOCMD) run -a -installsuffix cgo
-GOCLEAN=$(GOCMD) clean
-GOTEST=$(GOCMD) test -v
-GOGET=$(GOCMD) get
-
-GOFILES:=$(shell find $(ROOT_DIR) -name '*.go' -not -name '*_test.go')
-GOALLFILES:=$(shell find $(ROOT_DIR) -name '*.go')
-GOMODFILES:=go.mod go.sum
-
-
-.SECONDEXPANSION:
-$(GO_CACHE_DIR)/%: $(GOFILES) $(GOMODFILES) $$(BUILDDEPS)
-	@echo "Building:\t$*"
-	GO111MODULE=on GO_ENABLED=0 GOOS=linux $(GOBUILD) -o $@ cmd/appmgr.go
-
-
-.SECONDEXPANSION:
-$(GO_CACHE_DIR)/%_test: $(GOALLFILES) $(GOMODFILES) $$(BUILDDEPS) FORCE
-	@echo "Testing:\t$*"
-	GO111MODULE=on GO_ENABLED=0 GOOS=linux $(GOTEST) -coverprofile $(COVEROUT) ./pkg/resthooks/ ./pkg/helm/ ./pkg/cm/
-	test -e $@ && (eval $(TESTENV) $@ -test.coverprofile $(COVEROUT) || false) || true
-	test -e $@ && (go tool cover -html=$(COVEROUT) -o $(COVERHTML) || false) || true
-
-
-.SECONDEXPANSION:
-go-build: GO_TARGETS:=
-go-build: $$(GO_TARGETS)
-
-.SECONDEXPANSION:
-go-test: GO_TARGETS:=
-go-test: $$(GO_TARGETS)
-
-go-test-fmt: $(GOFILES)
-	@(RESULT="$$(gofmt -l $^)"; test -z "$${RESULT}" || (echo -e "gofmt failed:\n$${RESULT}" && false) )
-
-go-fmt: $(GOFILES)
-	gofmt -w -s $^
-
-go-mod-tidy: FORCE
-	GO111MODULE=on go mod tidy
-
-go-mod-download: FORCE
-	GO111MODULE=on go mod download
-
-go-clean: GO_TARGETS:=
-go-clean:
-	@echo "  >  Cleaning build cache"
-	@-rm -rf $(GO_TARGETS)* 2> /dev/null
-	go clean 2> /dev/null
-
-
-endif
-
-#------------------------------------------------------------------------------
-#
-#-------------------------------------------------------------------- ----------
-
-$(GO_CACHE_DIR)/$(XAPP_ROOT)/$(XAPP_NAME): BUILDDEPS:=$(XAPP_BUILDDEPS)
-
-
-$(GO_CACHE_DIR)/$(XAPP_ROOT)/$(XAPP_NAME)_test: BUILDDEPS:=$(XAPP_BUILDDEPS)
-$(GO_CACHE_DIR)/$(XAPP_ROOT)/$(XAPP_NAME)_test: COVEROUT:=$(abspath $(GO_CACHE_DIR)/$(XAPP_ROOT)/$(XAPP_NAME)_cover.out)
-$(GO_CACHE_DIR)/$(XAPP_ROOT)/$(XAPP_NAME)_test: COVERHTML:=$(abspath $(GO_CACHE_DIR)/$(XAPP_ROOT)/$(XAPP_NAME)_cover.html)
-$(GO_CACHE_DIR)/$(XAPP_ROOT)/$(XAPP_NAME)_test: TESTENV:=$(XAPP_TESTENV)
-
-go-build: GO_TARGETS+=$(GO_CACHE_DIR)/$(XAPP_ROOT)/$(XAPP_NAME)
-go-test: GO_TARGETS+=$(GO_CACHE_DIR)/$(XAPP_ROOT)/$(XAPP_NAME)_test
-go-clean: GO_TARGETS+=$(GO_CACHE_DIR)/$(XAPP_ROOT)/$(XAPP_NAME) $(GO_CACHE_DIR)/$(XAPP_ROOT)/$(XAPP_NAME)_test
-
diff --git a/config/appmgr.yaml b/config/appmgr.yaml
index 58545fc..8f24929 100755
--- a/config/appmgr.yaml
+++ b/config/appmgr.yaml
@@ -13,8 +13,6 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
-"local":
-  "host": ":8080"
 "helm":
   "host": "192.168.0.12:31807"
   "repo": "http://192.168.0.6/charts"
@@ -26,7 +24,7 @@
   "helm-password-file": "./helm_repo_password"
   "retry": 1
 "xapp":
-  "namespace": "default"
+  "namespace": "ricxapp"
   "tarDir": "/tmp"
   "schema": "descriptors/schema.json"
   "config": "config/config-file.json"
diff --git a/container-tag.yaml b/container-tag.yaml
index 3724441..98ef6c2 100755
--- a/container-tag.yaml
+++ b/container-tag.yaml
@@ -1,4 +1,4 @@
 # The Jenkins job uses this string for the tag in the image name
 # for example nexus3.o-ran-sc.org:10004/my-image-name:my-tag
 ---
-tag: '0.2.0'
+tag: '0.3.0'
diff --git a/pkg/appmgr/appmgr.go b/pkg/appmgr/appmgr.go
index 28e98f9..03bcdcf 100755
--- a/pkg/appmgr/appmgr.go
+++ b/pkg/appmgr/appmgr.go
@@ -68,5 +68,5 @@
 func Init() {
 	loadConfig()
 	Logger = logger.NewLogger("appmgr")
-	Logger.SetMdc("xm", "0.2.0")
+	Logger.SetMdc("xm", "0.3.0")
 }
diff --git a/pkg/restful/restful.go b/pkg/restful/restful.go
index c0ef580..b2a94e3 100755
--- a/pkg/restful/restful.go
+++ b/pkg/restful/restful.go
@@ -43,7 +43,7 @@
 	r := &Restful{
 		helm:  helm.NewHelm(),
 		cm:    cm.NewCM(),
-		rh:    resthooks.NewResthook(),
+		rh:    resthooks.NewResthook(true),
 		ready: false,
 	}
 	r.api = r.SetupHandler()
@@ -53,8 +53,8 @@
 func (r *Restful) Run() {
 	server := restapi.NewServer(r.api)
 	defer server.Shutdown()
-	server.Port = 8080      //viper.GetInt("local.port")
-	server.Host = "0.0.0.0" //viper.GetString("local.host")
+	server.Port = 8080
+	server.Host = "0.0.0.0"
 
 	appmgr.Logger.Info("Xapp manager started ... serving on %s:%d\n", server.Host, server.Port)
 
diff --git a/pkg/resthooks/resthooks.go b/pkg/resthooks/resthooks.go
index 5076b06..471eec1 100755
--- a/pkg/resthooks/resthooks.go
+++ b/pkg/resthooks/resthooks.go
@@ -32,13 +32,17 @@
 	"gerrit.oran-osc.org/r/ric-plt/appmgr/pkg/models"
 )
 
-func NewResthook() *Resthook {
+func NewResthook(restoreData bool) *Resthook {
 	rh := &Resthook{
 		client: &http.Client{},
 		db:     sdl.NewSdlInstance("appmgr", sdl.NewDatabase()),
 	}
 
-	rh.subscriptions = rh.RestoreSubscriptions()
+	if restoreData {
+		rh.subscriptions = rh.RestoreSubscriptions()
+	} else {
+		rh.subscriptions = cmap.New()
+	}
 	return rh
 }
 
@@ -122,7 +126,14 @@
 }
 
 func (rh *Resthook) notify(xapps models.AllDeployedXapps, et models.EventType, s SubscriptionInfo, seq int64) error {
-	notif := models.SubscriptionNotification{ID: s.Id, Version: seq, EventType: et, XApps: xapps}
+	xappData, err := json.Marshal(xapps)
+	if err != nil {
+		appmgr.Logger.Info("json.Marshal failed: %v", err)
+		return err
+	}
+
+	// TODO: Use models.SubscriptionNotification instead of internal ...
+	notif := SubscriptionNotification{ID: s.Id, Version: seq, Event: string(et), XApps: string(xappData)}
 	jsonData, err := json.Marshal(notif)
 	if err != nil {
 		appmgr.Logger.Info("json.Marshal failed: %v", err)
diff --git a/pkg/resthooks/resthooks_test.go b/pkg/resthooks/resthooks_test.go
index 018dee8..176fd2d 100755
--- a/pkg/resthooks/resthooks_test.go
+++ b/pkg/resthooks/resthooks_test.go
@@ -28,6 +28,7 @@
 	"gerrit.oran-osc.org/r/ric-plt/appmgr/pkg/models"
 )
 
+var rh *Resthook
 var resp models.SubscriptionResponse
 
 // Test cases
@@ -35,88 +36,89 @@
 	appmgr.Init()
 	appmgr.Logger.SetLevel(0)
 
+	rh = NewResthook(false)
 	code := m.Run()
 	os.Exit(code)
 }
 
 func TestAddSubscriptionSuccess(t *testing.T) {
-	resp := NewResthook().AddSubscription(CreateSubscription(models.EventTypeCreated, int64(5), int64(10), "http://localhost:8087/xapps_hook"))
+	resp := rh.AddSubscription(CreateSubscription(models.EventTypeCreated, int64(5), int64(10), "http://localhost:8087/xapps_hook"))
 	assert.Equal(t, resp.Version, int64(0))
 	assert.Equal(t, resp.EventType, models.EventTypeCreated)
 }
 
 func TestAddSubscriptionExists(t *testing.T) {
-	resp := NewResthook().AddSubscription(CreateSubscription(models.EventTypeCreated, int64(5), int64(10), "http://localhost:8087/xapps_hook"))
+	resp := rh.AddSubscription(CreateSubscription(models.EventTypeCreated, int64(5), int64(10), "http://localhost:8087/xapps_hook"))
 	assert.Equal(t, resp.Version, int64(0))
 	assert.Equal(t, resp.EventType, models.EventType(""))
 }
 
 func TestDeletesubscriptionSuccess(t *testing.T) {
-	resp := NewResthook().AddSubscription(CreateSubscription(models.EventTypeDeleted, int64(5), int64(10), "http://localhost:8087/xapps_hook2"))
+	resp := rh.AddSubscription(CreateSubscription(models.EventTypeDeleted, int64(5), int64(10), "http://localhost:8087/xapps_hook2"))
 	assert.Equal(t, resp.Version, int64(0))
 	assert.Equal(t, resp.EventType, models.EventTypeDeleted)
 
-	resp, ok := NewResthook().DeleteSubscription(resp.ID)
+	resp, ok := rh.DeleteSubscription(resp.ID)
 	assert.Equal(t, ok, true)
 	assert.Equal(t, resp.Version, int64(0))
 	assert.Equal(t, resp.EventType, models.EventTypeDeleted)
 }
 
 func TestDeletesubscriptionInvalid(t *testing.T) {
-	resp, ok := NewResthook().DeleteSubscription("Non-existent-ID")
+	resp, ok := rh.DeleteSubscription("Non-existent-ID")
 	assert.Equal(t, ok, false)
 	assert.Equal(t, resp.Version, int64(0))
 	assert.Equal(t, resp.EventType, models.EventType(""))
 }
 
 func TestModifySubscriptionSuccess(t *testing.T) {
-	resp := NewResthook().AddSubscription(CreateSubscription(models.EventTypeCreated, int64(5), int64(10), "http://localhost:8087/xapps_hook2"))
+	resp := rh.AddSubscription(CreateSubscription(models.EventTypeCreated, int64(5), int64(10), "http://localhost:8087/xapps_hook2"))
 	assert.Equal(t, resp.Version, int64(0))
 	assert.Equal(t, resp.EventType, models.EventTypeCreated)
 
-	resp, ok := NewResthook().ModifySubscription(resp.ID, CreateSubscription(models.EventTypeModified, int64(5), int64(10), "http://localhost:8087/xapps_hook2"))
+	resp, ok := rh.ModifySubscription(resp.ID, CreateSubscription(models.EventTypeModified, int64(5), int64(10), "http://localhost:8087/xapps_hook2"))
 	assert.Equal(t, ok, true)
 	assert.Equal(t, resp.Version, int64(0))
 	assert.Equal(t, resp.EventType, models.EventTypeModified)
 }
 
 func TestModifysubscriptionInvalid(t *testing.T) {
-	resp, ok := NewResthook().DeleteSubscription("Non-existent-ID")
+	resp, ok := rh.DeleteSubscription("Non-existent-ID")
 	assert.Equal(t, ok, false)
 	assert.Equal(t, resp.Version, int64(0))
 	assert.Equal(t, resp.EventType, models.EventType(""))
 }
 
 func TestGetAllSubscriptionSuccess(t *testing.T) {
-	NewResthook().FlushSubscriptions()
-	subscriptions := NewResthook().GetAllSubscriptions()
+	rh.FlushSubscriptions()
+	subscriptions := rh.GetAllSubscriptions()
 	assert.Equal(t, len(subscriptions), 0)
 
-	NewResthook().AddSubscription(CreateSubscription(models.EventTypeCreated, int64(5), int64(10), "http://localhost:8087/xapps_hook"))
-	NewResthook().AddSubscription(CreateSubscription(models.EventTypeModified, int64(5), int64(10), "http://localhost:8087/xapps_hook2"))
+	rh.AddSubscription(CreateSubscription(models.EventTypeCreated, int64(5), int64(10), "http://localhost:8087/xapps_hook"))
+	rh.AddSubscription(CreateSubscription(models.EventTypeModified, int64(5), int64(10), "http://localhost:8087/xapps_hook2"))
 
-	subscriptions = NewResthook().GetAllSubscriptions()
+	subscriptions = rh.GetAllSubscriptions()
 	assert.Equal(t, len(subscriptions), 2)
 }
 
 func TestGetSubscriptionByIdSuccess(t *testing.T) {
-	NewResthook().FlushSubscriptions()
+	rh.FlushSubscriptions()
 	sub1 := CreateSubscription(models.EventTypeCreated, int64(5), int64(10), "http://localhost:8087/xapps_hook")
 	sub2 := CreateSubscription(models.EventTypeModified, int64(5), int64(10), "http://localhost:8087/xapps_hook2")
-	r1 := NewResthook().AddSubscription(sub1)
-	r2 := NewResthook().AddSubscription(sub2)
+	r1 := rh.AddSubscription(sub1)
+	r2 := rh.AddSubscription(sub2)
 
-	resp1, ok := NewResthook().GetSubscriptionById(r1.ID)
+	resp1, ok := rh.GetSubscriptionById(r1.ID)
 	assert.Equal(t, ok, true)
 	assert.Equal(t, resp1.Data, sub1.Data)
 
-	resp2, ok := NewResthook().GetSubscriptionById(r2.ID)
+	resp2, ok := rh.GetSubscriptionById(r2.ID)
 	assert.Equal(t, ok, true)
 	assert.Equal(t, resp2.Data, sub2.Data)
 }
 
 func TestTeardown(t *testing.T) {
-	NewResthook().FlushSubscriptions()
+	rh.FlushSubscriptions()
 }
 
 func CreateSubscription(et models.EventType, maxRetries, retryTimer int64, targetUrl string) models.SubscriptionRequest {
diff --git a/pkg/resthooks/types.go b/pkg/resthooks/types.go
index 830576b..e613476 100755
--- a/pkg/resthooks/types.go
+++ b/pkg/resthooks/types.go
@@ -39,3 +39,11 @@
 	db            *sdl.SdlInstance
 	Seq           int64
 }
+
+// TODO: remove this when RTMGR changes done
+type SubscriptionNotification struct {
+	Event   string `json:"eventType,omitempty"`
+	ID      string `json:"id,omitempty"`
+	Version int64  `json:"version,omitempty"`
+	XApps   string `json:"xApps,omitempty"`
+}