Skip to content
Snippets Groups Projects
Commit a2b27d18 authored by Manuel Kieweg's avatar Manuel Kieweg
Browse files

Merge branch 120-integration-tests-fail with refs/heads/develop into refs/merge-requests/159/train

parents ffb10766 1bd2ae49
No related branches found
No related tags found
No related merge requests found
Pipeline #73922 passed
...@@ -8,7 +8,7 @@ import ( ...@@ -8,7 +8,7 @@ import (
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
appv1 "k8s.io/api/apps/v1" appv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
netv1 "k8s.io/api/networking/v1beta1" netv1 "k8s.io/api/networking/v1"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/intstr"
...@@ -16,6 +16,12 @@ import ( ...@@ -16,6 +16,12 @@ import (
"k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd"
) )
// GRPC defines the grpc port used by the deployment
const GRPC = 55055
// HTTP defines the http port used by the deployment
const HTTP = 8080
func main() { func main() {
log.SetFormatter(&log.JSONFormatter{}) log.SetFormatter(&log.JSONFormatter{})
kubeconfig, err := clientcmd.BuildConfigFromFlags("https://api.ocp.fbi.h-da.de:6443", "") kubeconfig, err := clientcmd.BuildConfigFromFlags("https://api.ocp.fbi.h-da.de:6443", "")
...@@ -86,7 +92,7 @@ func create(clientset *kubernetes.Clientset, tag string) error { ...@@ -86,7 +92,7 @@ func create(clientset *kubernetes.Clientset, tag string) error {
} else { } else {
log.Printf("service %v created", service.Name) log.Printf("service %v created", service.Name)
} }
_, err = clientset.NetworkingV1beta1().Ingresses("cocsn").Create(ctx, ingress, opts) _, err = clientset.NetworkingV1().Ingresses("cocsn").Create(ctx, ingress, opts)
if err != nil { if err != nil {
switch err.(type) { switch err.(type) {
case *errors.StatusError: case *errors.StatusError:
...@@ -159,12 +165,12 @@ func update(clientset *kubernetes.Clientset, resource metav1.Common, env string) ...@@ -159,12 +165,12 @@ func update(clientset *kubernetes.Clientset, resource metav1.Common, env string)
log.Printf("service %v updated", service.Name) log.Printf("service %v updated", service.Name)
case *netv1.Ingress: case *netv1.Ingress:
ingress := resource ingress := resource
i, err := clientset.NetworkingV1beta1().Ingresses("cocsn").Get(ctx, env, getOpts) i, err := clientset.NetworkingV1().Ingresses("cocsn").Get(ctx, env, getOpts)
if err != nil { if err != nil {
return err return err
} }
i.DeepCopyInto(ingress) i.DeepCopyInto(ingress)
_, err = clientset.NetworkingV1beta1().Ingresses("cocsn").Update(ctx, ingress, opts) _, err = clientset.NetworkingV1().Ingresses("cocsn").Update(ctx, ingress, opts)
if err != nil { if err != nil {
return err return err
} }
...@@ -245,13 +251,13 @@ func createService(environment string) *corev1.Service { ...@@ -245,13 +251,13 @@ func createService(environment string) *corev1.Service {
Ports: []corev1.ServicePort{ Ports: []corev1.ServicePort{
{ {
Name: "http", Name: "http",
Port: 8080, Port: HTTP,
TargetPort: intstr.IntOrString{IntVal: 8080}, TargetPort: intstr.IntOrString{IntVal: HTTP},
}, },
{ {
Name: "grpc", Name: "grpc",
Port: 55055, Port: GRPC,
TargetPort: intstr.IntOrString{IntVal: 55055}, TargetPort: intstr.IntOrString{IntVal: GRPC},
}, },
}, },
Selector: map[string]string{"run": environment}, Selector: map[string]string{"run": environment},
...@@ -301,11 +307,11 @@ func createDeployment(environment, hash string) *appv1.Deployment { ...@@ -301,11 +307,11 @@ func createDeployment(environment, hash string) *appv1.Deployment {
Ports: []corev1.ContainerPort{ Ports: []corev1.ContainerPort{
{ {
Name: "grpc", Name: "grpc",
ContainerPort: 55055, ContainerPort: GRPC,
}, },
{ {
Name: "http", Name: "http",
ContainerPort: 8080, ContainerPort: HTTP,
}, },
}, },
VolumeMounts: []corev1.VolumeMount{ VolumeMounts: []corev1.VolumeMount{
...@@ -318,7 +324,7 @@ func createDeployment(environment, hash string) *appv1.Deployment { ...@@ -318,7 +324,7 @@ func createDeployment(environment, hash string) *appv1.Deployment {
Handler: corev1.Handler{ Handler: corev1.Handler{
HTTPGet: &corev1.HTTPGetAction{ HTTPGet: &corev1.HTTPGetAction{
Path: "/livez", Path: "/livez",
Port: intstr.IntOrString{IntVal: 8080}, Port: intstr.IntOrString{IntVal: HTTP},
}, },
}, },
InitialDelaySeconds: 5, InitialDelaySeconds: 5,
...@@ -328,7 +334,7 @@ func createDeployment(environment, hash string) *appv1.Deployment { ...@@ -328,7 +334,7 @@ func createDeployment(environment, hash string) *appv1.Deployment {
Handler: corev1.Handler{ Handler: corev1.Handler{
HTTPGet: &corev1.HTTPGetAction{ HTTPGet: &corev1.HTTPGetAction{
Path: "/readyz", Path: "/readyz",
Port: intstr.IntOrString{IntVal: 8080}, Port: intstr.IntOrString{IntVal: HTTP},
}, },
}, },
InitialDelaySeconds: 10, InitialDelaySeconds: 10,
...@@ -364,6 +370,7 @@ func createConfigMap(env string) *corev1.ConfigMap { ...@@ -364,6 +370,7 @@ func createConfigMap(env string) *corev1.ConfigMap {
} }
func createIngress(env string) *netv1.Ingress { func createIngress(env string) *netv1.Ingress {
pathType := netv1.PathTypeImplementationSpecific
return &netv1.Ingress{ return &netv1.Ingress{
TypeMeta: metav1.TypeMeta{ TypeMeta: metav1.TypeMeta{
Kind: "Ingress", Kind: "Ingress",
...@@ -372,6 +379,11 @@ func createIngress(env string) *netv1.Ingress { ...@@ -372,6 +379,11 @@ func createIngress(env string) *netv1.Ingress {
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: env, Name: env,
Namespace: "cocsn", Namespace: "cocsn",
Annotations: map[string]string{
"nginx.ingress.kubernetes.io/backend-protocol": "GRPC",
"kubernetes.io/ingress.class": "nginx",
"nginx.ingress.kubernetes.io/ssl-redirect": "true",
},
}, },
Spec: netv1.IngressSpec{ Spec: netv1.IngressSpec{
Rules: []netv1.IngressRule{ Rules: []netv1.IngressRule{
...@@ -381,10 +393,12 @@ func createIngress(env string) *netv1.Ingress { ...@@ -381,10 +393,12 @@ func createIngress(env string) *netv1.Ingress {
HTTP: &netv1.HTTPIngressRuleValue{ HTTP: &netv1.HTTPIngressRuleValue{
Paths: []netv1.HTTPIngressPath{ Paths: []netv1.HTTPIngressPath{
{ {
Path: "/api", PathType: &pathType,
Backend: netv1.IngressBackend{ Backend: netv1.IngressBackend{
ServiceName: env, Service: &netv1.IngressServiceBackend{
ServicePort: intstr.IntOrString{IntVal: 8080}, Name: env,
Port: netv1.ServiceBackendPort{Name: "grpc"},
},
}, },
}, },
}, },
...@@ -393,6 +407,5 @@ func createIngress(env string) *netv1.Ingress { ...@@ -393,6 +407,5 @@ func createIngress(env string) *netv1.Ingress {
}, },
}, },
}, },
Status: netv1.IngressStatus{},
} }
} }
services: services:
- docker:19.03.12-dind - name: docker:19.03.12-dind
command: ["--registry-mirror", "http://141.100.70.170:6000"]
variables: variables:
DOCKER_TLS_CERTDIR: "/certs" DOCKER_TLS_CERTDIR: "/certs"
...@@ -14,6 +15,7 @@ variables: ...@@ -14,6 +15,7 @@ variables:
tags: tags:
- dind - dind
script: script:
- docker info
- > - >
docker build \ docker build \
--build-arg GITLAB_USER=$GO_MODULES_USER \ --build-arg GITLAB_USER=$GO_MODULES_USER \
......
...@@ -14,7 +14,9 @@ build:k8s-bot: ...@@ -14,7 +14,9 @@ build:k8s-bot:
- build/cd/k8s-bot - build/cd/k8s-bot
.deploy: &deploy .deploy: &deploy
image: bitnami/kubectl:latest image:
name: bitnami/kubectl:latest
entrypoint: [""]
before_script: before_script:
- echo "override global before script" - echo "override global before script"
variables: variables:
...@@ -73,7 +75,9 @@ deploy:nightly:develop: ...@@ -73,7 +75,9 @@ deploy:nightly:develop:
- if: $CI_COMMIT_BRANCH == "develop" && $CI_NIGHTLY == "mainline" - if: $CI_COMMIT_BRANCH == "develop" && $CI_NIGHTLY == "mainline"
destroy:k8s: destroy:k8s:
image: bitnami/kubectl:latest image:
name: bitnami/kubectl:latest
entrypoint: [""]
rules: rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event" - if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: always when: always
......
integration-test: .integration-test: &integration-test
image: golang:1.16 image: golang:1.16
stage: integration-test stage: integration-test
needs: needs:
- job: "apply" - job: "apply"
- job: "deploy:integration-test" - job: "deploy:integration-test"
variables: variables:
GOSDN_LOG: "nolog" GOSDN_TEST_API_ENDPOINT: gosdn-$CI_COMMIT_SHA.apps.ocp.fbi.h-da.de:80
GOSDN_TEST_API_ENDPOINT: http://gosdn-$CI_COMMIT_SHA.apps.ocp.fbi.h-da.de/api
rules: rules:
- if: $CI_NIGHTLY - if: $CI_NIGHTLY
when: delayed when: delayed
...@@ -18,8 +17,27 @@ integration-test: ...@@ -18,8 +17,27 @@ integration-test:
allow_failure: true allow_failure: true
when: delayed when: delayed
start_in: 2 minutes start_in: 2 minutes
integration-test:nucleus:
<<: *integration-test
script:
- cd ./test/integration
- go test -race -v -run TestGnmi_SetIntegration
- go test -race -v -run TestGnmi_GetIntegration
- go test -race -v -run TestGnmi_SubscribeIntegration
- go test -race -v -run TestGnmi_CapabilitiesIntegration
integration-test:cmd:
<<: *integration-test
script: script:
- go test -race ./test/integration -v -coverprofile=coverage.out - cd ./test/integration
- go test -race -v -run TestCmdIntegration
integration-test:cli:
<<: *integration-test
script:
- cd ./test/integration
- go test -race -v -run TestCapabilities
.test: &test .test: &test
image: golang:1.16 image: golang:1.16
...@@ -45,4 +63,4 @@ unit-test: ...@@ -45,4 +63,4 @@ unit-test:
controller-test: controller-test:
script: script:
- go test -race -v -run TestRun - go test -race -v -run TestRun
<<: *test <<: *test
\ No newline at end of file
...@@ -19,6 +19,9 @@ func Capabilities(a, u, p string) error { ...@@ -19,6 +19,9 @@ func Capabilities(a, u, p string) error {
Address: a, Address: a,
Username: u, Username: u,
Password: p, Password: p,
TransportOption: &tpb.TransportOption_GnmiTransportOption{
GnmiTransportOption: &tpb.GnmiTransportOption{},
},
} }
transport, err := nucleus.NewGnmiTransport(opts, nucleus.NewSBI(spb.Type_OPENCONFIG)) transport, err := nucleus.NewGnmiTransport(opts, nucleus.NewSBI(spb.Type_OPENCONFIG))
if err != nil { if err != nil {
......
...@@ -69,6 +69,7 @@ func startGrpcServer() error { ...@@ -69,6 +69,7 @@ func startGrpcServer() error {
if err != nil { if err != nil {
return err return err
} }
log.Infof("listening to %v", lis.Addr())
c.grpcServer = grpc.NewServer() c.grpcServer = grpc.NewServer()
c.nbi = nbi.NewNBI(c.pndc) c.nbi = nbi.NewNBI(c.pndc)
pb.RegisterCoreServer(c.grpcServer, c.nbi.Core) pb.RegisterCoreServer(c.grpcServer, c.nbi.Core)
......
...@@ -6,8 +6,8 @@ require ( ...@@ -6,8 +6,8 @@ require (
code.fbi.h-da.de/cocsn/api/go v0.0.0-20210528163424-f37e91dc5895 code.fbi.h-da.de/cocsn/api/go v0.0.0-20210528163424-f37e91dc5895
code.fbi.h-da.de/cocsn/yang-models v0.0.7 code.fbi.h-da.de/cocsn/yang-models v0.0.7
github.com/aristanetworks/goarista v0.0.0-20201120222254-94a892eb0c6a github.com/aristanetworks/goarista v0.0.0-20201120222254-94a892eb0c6a
github.com/golang/protobuf v1.5.2
github.com/docker/docker v1.13.1 github.com/docker/docker v1.13.1
github.com/golang/protobuf v1.5.2
github.com/google/gnxi v0.0.0-20201221102247-c26672548161 github.com/google/gnxi v0.0.0-20201221102247-c26672548161
github.com/google/uuid v1.1.2 github.com/google/uuid v1.1.2
github.com/neo4j/neo4j-go-driver v1.8.3 github.com/neo4j/neo4j-go-driver v1.8.3
......
...@@ -43,20 +43,18 @@ type Gnmi struct { ...@@ -43,20 +43,18 @@ type Gnmi struct {
// transport based on the values of it. // transport based on the values of it.
func NewGnmiTransport(opts *tpb.TransportOption, sbi SouthboundInterface) (*Gnmi, error) { func NewGnmiTransport(opts *tpb.TransportOption, sbi SouthboundInterface) (*Gnmi, error) {
gnmiConfig := &gnmi.Config{ gnmiConfig := &gnmi.Config{
Addr: opts.Address, Addr: opts.Address,
Password: opts.Password, Password: opts.Password,
Username: opts.Username, Username: opts.Username,
TLS: opts.Tls, TLS: opts.Tls,
Compression: opts.GetGnmiTransportOption().Compression,
} }
c, err := gnmi.Dial(gnmiConfig) c, err := gnmi.Dial(gnmiConfig)
if err != nil { if err != nil {
return nil, err return nil, err
} }
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"target": opts.Address, "target": opts.Address,
"tls": opts.Tls, "tls": opts.Tls,
"encoding": opts.GetGnmiTransportOption().Encoding,
}).Info("building new gNMI transport") }).Info("building new gNMI transport")
return &Gnmi{ return &Gnmi{
SetNode: sbi.SetNode(), SetNode: sbi.SetNode(),
......
...@@ -19,7 +19,7 @@ const unreachable = "203.0.113.10:6030" ...@@ -19,7 +19,7 @@ const unreachable = "203.0.113.10:6030"
const testPath = "/system/config/hostname" const testPath = "/system/config/hostname"
var testAddress = "141.100.70.171:6030" var testAddress = "141.100.70.171:6030"
var testAPIEndpoint = "http://gosdn-latest.apps.ocp.fbi.h-da.de/api" var testAPIEndpoint = "gosdn-latest.apps.ocp.fbi.h-da.de:55055"
var testUsername = "admin" var testUsername = "admin"
var testPassword = "arista" var testPassword = "arista"
var opt *tpb.TransportOption var opt *tpb.TransportOption
...@@ -83,6 +83,8 @@ func testSetupIntegration() { ...@@ -83,6 +83,8 @@ func testSetupIntegration() {
} }
func TestCmdIntegration(t *testing.T) { func TestCmdIntegration(t *testing.T) {
// TDOO: Remove once openshift grpc support is available
t.Skip("skipped due to openshift limitations")
if testing.Short() { if testing.Short() {
t.Skip("skipping integration test") t.Skip("skipping integration test")
} }
......
...@@ -172,9 +172,9 @@ func TestGnmi_SubscribeIntegration(t *testing.T) { ...@@ -172,9 +172,9 @@ func TestGnmi_SubscribeIntegration(t *testing.T) {
name: "default", name: "default",
fields: fields{ fields: fields{
opt: &tpb.TransportOption{ opt: &tpb.TransportOption{
Address: "", Address: testAddress,
Username: "", Username: testUsername,
Password: "", Password: testPassword,
Tls: false, Tls: false,
TransportOption: &tpb.TransportOption_GnmiTransportOption{ TransportOption: &tpb.TransportOption_GnmiTransportOption{
GnmiTransportOption: &tpb.GnmiTransportOption{ GnmiTransportOption: &tpb.GnmiTransportOption{
...@@ -250,7 +250,7 @@ func TestGnmi_SubscribeIntegration(t *testing.T) { ...@@ -250,7 +250,7 @@ func TestGnmi_SubscribeIntegration(t *testing.T) {
if (subErr != nil) != wantErr { if (subErr != nil) != wantErr {
if !wantErr && subErr != nil { if !wantErr && subErr != nil {
if subErr.Error() != "rpc error: code = Canceled desc = context canceled" { if subErr.Error() != "rpc error: code = Canceled desc = context canceled" {
t.Errorf("Subscribe() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("Subscribe() error = %v, wantErr %v", subErr, tt.wantErr)
} }
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment