From a13d672adc75555a72053099e008daa406423eb4 Mon Sep 17 00:00:00 2001 From: Irina Date: Wed, 22 Apr 2020 18:27:26 +0300 Subject: [PATCH] RIC-208 - KA Decision: ask K8S to restart E2T instance Change-Id: I8dc3bfec43404937152b897a15b1c31b19d6b3f2 Signed-off-by: Irina --- E2Manager/Dockerfile | 1 + E2Manager/configuration/configuration.go | 20 ++++---- E2Manager/configuration/configuration_test.go | 10 ++-- E2Manager/container-tag.yaml | 2 +- E2Manager/go.sum | 1 + E2Manager/{kub_config.yml => kube_config.yml} | 0 E2Manager/managers/e2t_shutdown_manager.go | 2 +- E2Manager/managers/e2t_shutdown_manager_test.go | 25 ++++----- E2Manager/managers/kubernetes_manager.go | 67 ++++--------------------- E2Manager/managers/kubernetes_manager_test.go | 7 ++- E2Manager/resources/configuration.yaml | 5 +- 11 files changed, 48 insertions(+), 92 deletions(-) rename E2Manager/{kub_config.yml => kube_config.yml} (100%) diff --git a/E2Manager/Dockerfile b/E2Manager/Dockerfile index 1679468..c6b943b 100755 --- a/E2Manager/Dockerfile +++ b/E2Manager/Dockerfile @@ -39,6 +39,7 @@ RUN apt-get update && apt-get install -y \ tcpdump COPY --from=ubuntu /opt/E2Manager/router.txt /opt/E2Manager/router.txt +COPY --from=ubuntu /opt/E2Manager/kube_config.yml /opt/E2Manager/kube_config.yml COPY --from=ubuntu /opt/E2Manager/main /opt/E2Manager/main COPY --from=ubuntu /opt/E2Manager/resources/configuration.yaml /opt/E2Manager/resources/configuration.yaml COPY --from=ubuntu /opt/E2Manager/resources/rmr.verbose /tmp/rmr.verbose diff --git a/E2Manager/configuration/configuration.go b/E2Manager/configuration/configuration.go index 43beee0..4e8883e 100644 --- a/E2Manager/configuration/configuration.go +++ b/E2Manager/configuration/configuration.go @@ -38,10 +38,10 @@ type Configuration struct { RoutingManager struct { BaseUrl string } -/* Kubernetes struct { + Kubernetes struct { ConfigPath string - Namespace string - }*/ + KubeNamespace string + } NotificationResponseBuffer int BigRedButtonTimeoutSec int MaxRnibConnectionAttempts int @@ -72,7 +72,7 @@ func ParseConfiguration() *Configuration { config.populateHttpConfig(viper.Sub("http")) config.populateLoggingConfig(viper.Sub("logging")) config.populateRoutingManagerConfig(viper.Sub("routingManager")) - //config.populateKubernetesConfig(viper.Sub("kubernetes")) + config.populateKubernetesConfig(viper.Sub("kubernetes")) config.NotificationResponseBuffer = viper.GetInt("notificationResponseBuffer") config.BigRedButtonTimeoutSec = viper.GetInt("bigRedButtonTimeoutSec") config.MaxRnibConnectionAttempts = viper.GetInt("maxRnibConnectionAttempts") @@ -113,13 +113,13 @@ func (c *Configuration) populateRoutingManagerConfig(rmConfig *viper.Viper) { c.RoutingManager.BaseUrl = rmConfig.GetString("baseUrl") } -/*func (c *Configuration) populateKubernetesConfig(rmConfig *viper.Viper) { +func (c *Configuration) populateKubernetesConfig(rmConfig *viper.Viper) { if rmConfig == nil { panic(fmt.Sprintf("#configuration.populateKubernetesConfig - failed to populate Kubernetes configuration: The entry 'kubernetes' not found\n")) } c.Kubernetes.ConfigPath = rmConfig.GetString("configPath") - c.Kubernetes.Namespace = rmConfig.GetString("namespace") -}*/ + c.Kubernetes.KubeNamespace = rmConfig.GetString("kubeNamespace") +} func (c *Configuration) populateGlobalRicIdConfig(globalRicIdConfig *viper.Viper) { if globalRicIdConfig == nil { @@ -133,7 +133,7 @@ func (c *Configuration) String() string { return fmt.Sprintf("{logging.logLevel: %s, http.port: %d, rmr: { port: %d, maxMsgSize: %d}, routingManager.baseUrl: %s, "+ "notificationResponseBuffer: %d, bigRedButtonTimeoutSec: %d, maxRnibConnectionAttempts: %d, "+ "rnibRetryIntervalMs: %d, keepAliveResponseTimeoutMs: %d, keepAliveDelayMs: %d, e2tInstanceDeletionTimeoutMs: %d, "+ - "globalRicId: { plmnId: %s, ricNearRtId: %s}}",//, kubernetes: {configPath: %s, namespace: %s}}", + "globalRicId: { plmnId: %s, ricNearRtId: %s, kubernetes: {configPath: %s, kubeNamespace: %s}}", c.Logging.LogLevel, c.Http.Port, c.Rmr.Port, @@ -148,7 +148,7 @@ func (c *Configuration) String() string { c.E2TInstanceDeletionTimeoutMs, c.GlobalRicId.PlmnId, c.GlobalRicId.RicNearRtId, - // c.Kubernetes.ConfigPath, - //c.Kubernetes.Namespace, + c.Kubernetes.ConfigPath, + c.Kubernetes.KubeNamespace, ) } diff --git a/E2Manager/configuration/configuration_test.go b/E2Manager/configuration/configuration_test.go index cdbf338..cad2254 100644 --- a/E2Manager/configuration/configuration_test.go +++ b/E2Manager/configuration/configuration_test.go @@ -42,8 +42,8 @@ func TestParseConfigurationSuccess(t *testing.T) { assert.NotNil(t, config.GlobalRicId) assert.NotEmpty(t, config.GlobalRicId.PlmnId) assert.NotEmpty(t, config.GlobalRicId.RicNearRtId) - /*assert.NotEmpty(t, config.Kubernetes.Namespace) - assert.NotEmpty(t, config.Kubernetes.ConfigPath)*/ + assert.NotEmpty(t, config.Kubernetes.KubeNamespace) + assert.NotEmpty(t, config.Kubernetes.ConfigPath) } func TestStringer(t *testing.T) { @@ -208,7 +208,7 @@ func TestGlobalRicIdConfigNotFoundFailure(t *testing.T) { "logging": map[string]interface{}{"logLevel": "info"}, "http": map[string]interface{}{"port": 3800}, "routingManager": map[string]interface{}{"baseUrl": "http://iltlv740.intl.att.com:8080/ric/v1/handles/"}, - //"kubernetes": map[string]interface{}{"namespace": "test", "ConfigPath": "test"}, + "kubernetes": map[string]interface{}{"kubeNamespace": "test", "ConfigPath": "test"}, } buf, err := yaml.Marshal(yamlMap) if err != nil { @@ -222,7 +222,7 @@ func TestGlobalRicIdConfigNotFoundFailure(t *testing.T) { func() { ParseConfiguration() }) } -/*func TestKubernetesConfigNotFoundFailure(t *testing.T) { +func TestKubernetesConfigNotFoundFailure(t *testing.T) { configPath := "../resources/configuration.yaml" configPathTmp := "../resources/configuration.yaml_tmp" err := os.Rename(configPath, configPathTmp) @@ -252,4 +252,4 @@ func TestGlobalRicIdConfigNotFoundFailure(t *testing.T) { } assert.PanicsWithValue(t, "#configuration.populateKubernetesConfig - failed to populate Kubernetes configuration: The entry 'kubernetes' not found\n", func() { ParseConfiguration() }) -}*/ +} diff --git a/E2Manager/container-tag.yaml b/E2Manager/container-tag.yaml index 85beee9..5ea99c4 100644 --- a/E2Manager/container-tag.yaml +++ b/E2Manager/container-tag.yaml @@ -1,4 +1,4 @@ # The Jenkins job requires a tag to build the Docker image. # Global-JJB script assumes this file is in the repo root. --- -tag: 4.4.6 +tag: 4.4.7 diff --git a/E2Manager/go.sum b/E2Manager/go.sum index 193bed0..4bb1c2a 100644 --- a/E2Manager/go.sum +++ b/E2Manager/go.sum @@ -113,6 +113,7 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= diff --git a/E2Manager/kub_config.yml b/E2Manager/kube_config.yml similarity index 100% rename from E2Manager/kub_config.yml rename to E2Manager/kube_config.yml diff --git a/E2Manager/managers/e2t_shutdown_manager.go b/E2Manager/managers/e2t_shutdown_manager.go index 6287547..bb89e3b 100644 --- a/E2Manager/managers/e2t_shutdown_manager.go +++ b/E2Manager/managers/e2t_shutdown_manager.go @@ -62,7 +62,7 @@ func (m E2TShutdownManager) Shutdown(e2tInstance *entities.E2TInstance) error { return nil } - //go m.kubernetesManager.DeletePod(e2tInstance.PodName) + go m.kubernetesManager.DeletePod(e2tInstance.PodName) err := m.markE2tInstanceToBeDeleted(e2tInstance) if err != nil { diff --git a/E2Manager/managers/e2t_shutdown_manager_test.go b/E2Manager/managers/e2t_shutdown_manager_test.go index 499f067..7490c42 100644 --- a/E2Manager/managers/e2t_shutdown_manager_test.go +++ b/E2Manager/managers/e2t_shutdown_manager_test.go @@ -35,8 +35,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "io/ioutil" - //"k8s.io/apimachinery/pkg/runtime" - //"k8s.io/client-go/kubernetes/fake" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/kubernetes/fake" "net/http" "testing" "time" @@ -56,14 +56,11 @@ func initE2TShutdownManagerTest(t *testing.T) (*E2TShutdownManager, *mocks.RnibR httpClientMock := &mocks.HttpClientMock{} rmClient := clients.NewRoutingManagerClient(log, config, httpClientMock) associationManager := NewE2TAssociationManager(log, rnibDataService, e2tInstancesManager, rmClient) - //kubernetesManager := initKubernetesManagerTest(t) + kubernetesManager := initKubernetesManagerTest(t) - /*shutdownManager := NewE2TShutdownManager(log, config, rnibDataService, e2tInstancesManager, associationManager, kubernetesManager) + shutdownManager := NewE2TShutdownManager(log, config, rnibDataService, e2tInstancesManager, associationManager, kubernetesManager) - return shutdownManager, readerMock, writerMock, httpClientMock, kubernetesManager*/ - shutdownManager := NewE2TShutdownManager(log, config, rnibDataService, e2tInstancesManager, associationManager, nil) - - return shutdownManager, readerMock, writerMock, httpClientMock, nil + return shutdownManager, readerMock, writerMock, httpClientMock, kubernetesManager } func TestShutdownSuccess1OutOf3Instances(t *testing.T) { @@ -184,7 +181,7 @@ func TestShutdownSuccess1Instance2Rans(t *testing.T) { readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) - + } func TestShutdownE2tInstanceAlreadyBeingDeleted(t *testing.T) { @@ -201,7 +198,7 @@ func TestShutdownE2tInstanceAlreadyBeingDeleted(t *testing.T) { readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) - + } func TestShutdownFailureMarkInstanceAsToBeDeleted(t *testing.T) { @@ -218,7 +215,7 @@ func TestShutdownFailureMarkInstanceAsToBeDeleted(t *testing.T) { readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) - + } func TestShutdownFailureRoutingManagerError(t *testing.T) { @@ -273,7 +270,7 @@ func TestShutdownFailureRoutingManagerError(t *testing.T) { readerMock.AssertExpectations(t) writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) - + } func TestShutdownFailureInClearNodebsAssociation(t *testing.T) { @@ -412,7 +409,7 @@ func TestShutdownFailureInRemoveE2TInstance(t *testing.T) { writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) } -/* + func TestShutdownSuccess2Instance2Rans(t *testing.T) { shutdownManager, readerMock, writerMock, httpClientMock,kubernetesManager := initE2TShutdownManagerTest(t) @@ -507,4 +504,4 @@ func TestShutdownSuccess2Instance2RansNoPod(t *testing.T) { writerMock.AssertExpectations(t) httpClientMock.AssertExpectations(t) }) -}*/ \ No newline at end of file +} \ No newline at end of file diff --git a/E2Manager/managers/kubernetes_manager.go b/E2Manager/managers/kubernetes_manager.go index ef36c28..09a64b7 100644 --- a/E2Manager/managers/kubernetes_manager.go +++ b/E2Manager/managers/kubernetes_manager.go @@ -22,8 +22,12 @@ package managers import ( "e2mgr/configuration" + "e2mgr/e2managererrors" "e2mgr/logger" + metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/clientcmd" + "path/filepath" ) type KubernetesManager struct { @@ -35,32 +39,12 @@ type KubernetesManager struct { func NewKubernetesManager(logger *logger.Logger, config *configuration.Configuration) *KubernetesManager { return &KubernetesManager{ Logger: logger, - // ClientSet: createClientSet(logger, config), + ClientSet: createClientSet(logger, config), Config: config, } } -/*func (km KubernetesManager) GetAndDeletePod(namespace string, podName string) { - km.logger.Infof("#KubernetesManager.GetAndDeletePod - namespace: %s, POD name: %s ", namespace, podName) - - config, err := clientcmd.BuildConfigFromFlags("", "kubeConfigPath") - if err != nil { - log.Fatal(err) - } - - clientSet, _ := kubernetesManager.NewForConfig(config) - - podInterface := km.GetPodInterface(clientSet.CoreV1(), namespace, podName) - - if podInterface == nil{ - return - } - - km.DeletePod(podInterface, podName) -}*/ - -/*func createClientSet(logger *logger.Logger, config *configuration.Configuration) kubernetes.Interface { - ////path := os.Getenv("HOME") + "/.kube/config" +func createClientSet(logger *logger.Logger, config *configuration.Configuration) kubernetes.Interface { absConfigPath,err := filepath.Abs(config.Kubernetes.ConfigPath) if err != nil { @@ -80,22 +64,10 @@ func NewKubernetesManager(logger *logger.Logger, config *configuration.Configura return nil } return clientSet -}*/ - -/*func (km KubernetesManager) DeletePod(podInterface v1.PodInterface, podName string) { - km.logger.Infof("#KubernetesManager.DeletePod - POD name %s ", podName) - - err := podInterface.Delete(podName, &metaV1.DeleteOptions{}) - - if err != nil{ - km.logger.Warnf("#KubernetesManager.DeletePod - POD %s can't be deleted", podName) - return - } - km.logger.Infof("#KubernetesManager.DeletePod - POD %s was deleted", podName) } -*/ + func (km KubernetesManager) DeletePod(podName string) error { -/* km.Logger.Infof("#KubernetesManager.DeletePod - POD name: %s ", podName) + km.Logger.Infof("#KubernetesManager.DeletePod - POD name: %s ", podName) if km.ClientSet == nil { km.Logger.Errorf("#KubernetesManager.DeletePod - no kubernetesManager connection") @@ -107,30 +79,13 @@ func (km KubernetesManager) DeletePod(podName string) error { return e2managererrors.NewInternalError() } - err := km.ClientSet.CoreV1().Pods(km.Config.Kubernetes.Namespace).Delete(podName, &metaV1.DeleteOptions{}) + err := km.ClientSet.CoreV1().Pods(km.Config.Kubernetes.KubeNamespace).Delete(podName, &metaV1.DeleteOptions{}) if err != nil { km.Logger.Errorf("#KubernetesManager.DeletePod - POD %s can't be deleted, error: %s", podName, err) return err } - km.Logger.Infof("#KubernetesManager.DeletePod - POD %s was deleted", podName)*/ + km.Logger.Infof("#KubernetesManager.DeletePod - POD %s was deleted", podName) return nil -} - -/*func (km KubernetesManager) GetPodInterface(client v1.CoreV1Interface, namespace string, podName string) v1.PodInterface{ - km.logger.Infof("#KubernetesManager.GetPodInterface - namespace: %s, POD name: %s ", namespace, podName) - - - podInterface := client.Pods(namespace) - pod, err := podInterface.Get(podName, metaV1.GetOptions{}) - - if err != nil{ - km.logger.Warnf("#KubernetesManager.GetPodInterface - POD name: %s not found", podName) - return nil - } - - km.logger.Infof("#KubernetesManager.GetPodInterface - POD status: %s ", pod.Status.String()) - - return podInterface -}*/ +} \ No newline at end of file diff --git a/E2Manager/managers/kubernetes_manager_test.go b/E2Manager/managers/kubernetes_manager_test.go index dab5943..0b6a568 100644 --- a/E2Manager/managers/kubernetes_manager_test.go +++ b/E2Manager/managers/kubernetes_manager_test.go @@ -20,7 +20,7 @@ package managers -/* + import ( "e2mgr/configuration" "e2mgr/logger" @@ -45,7 +45,7 @@ func initKubernetesManagerTest(t *testing.T) *KubernetesManager { t.Errorf("#... - failed to initialize logger, error: %s", err) } config := &configuration.Configuration{} - config.Kubernetes.Namespace = "oran" + config.Kubernetes.KubeNamespace = "oran" config.Kubernetes.ConfigPath = "somePath" kubernetesManager := NewKubernetesManager(logger, config) @@ -148,5 +148,4 @@ func pod(namespace, image string) *v1.Pod { Annotations: map[string]string{}, }, } -} -*/ \ No newline at end of file +} \ No newline at end of file diff --git a/E2Manager/resources/configuration.yaml b/E2Manager/resources/configuration.yaml index d79565b..88e276a 100644 --- a/E2Manager/resources/configuration.yaml +++ b/E2Manager/resources/configuration.yaml @@ -16,4 +16,7 @@ keepAliveDelayMs: 1500 e2tInstanceDeletionTimeoutMs: 15000 globalRicId: plmnId: 131014 - ricNearRtId: 556670 \ No newline at end of file + ricNearRtId: 556670 +kubernetes: + configPath: ./kube_config.yml + kubeNamespace: ricplt \ No newline at end of file -- 2.16.6