diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e3338fe..077c5b8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -52,9 +52,15 @@ jobs: - name: Load Docker Image run: kind load docker-image rpc:1.0 --name k8scluster + - name: Build Daemon + run: docker build -t daemon:1.0 -f docker/dockerfile.daemon . + + - name: Load Docker Image + run: kind load docker-image daemon:1.0 --name k8scluster + - name: Apply main manifest - run: kubectl apply -f test/main.yaml + run: kubectl apply -f test/manifest.yaml - - name: Validate controller + - name: Validate run: ./test/expect diff --git a/.gitignore b/.gitignore index 915f2fb..647518c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ dev.db* rpc.toml daemon.toml +grpcurl* diff --git a/test/expect b/test/expect index fd1cb09..53c0722 100755 --- a/test/expect +++ b/test/expect @@ -1,11 +1,36 @@ +wget https://github.com/fullstorydev/grpcurl/releases/download/v1.9.1/grpcurl_1.9.1_linux_x86_64.tar.gz +tar -zxvf ./grpcurl_1.9.1_linux_x86_64.tar.gz grpcurl + +echo "Waiting for kafka to be ready..." + +while true; do + pod_status=$(kubectl get pods -n demeter-kafka -o 'jsonpath={.items[*].status.conditions[?(@.type=="Ready")].status}' | grep True) + + if [[ -n "$pod_status" ]]; then + break + else + echo "Kafka is not ready yet, waiting..." + sleep 5 + fi +done + +NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}') +NAMESPACE=$(./grpcurl -plaintext -d '{"name": "New Namespace"}' "$NODE_IP":30950 demeter.ops.v1alpha.ProjectService.CreateProject | jq -r '.namespace') ATTEMPT=1 -MAX_ATTEMPT=12 +MAX_ATTEMPT=120 echo "Checking executation" while [ $ATTEMPT -lt $MAX_ATTEMPT ]; do - let ATTEMPT=ATTEMPT+1 - kubectl get pod -n demeter-rpc - kubectl logs -n demeter-rpc $(kubectl get pods -n demeter-rpc -o json | jq -r '.items | sort_by(.metadata.creationTimestamp) | .[0].metadata.name') - sleep 2 + if kubectl get namespace "$NAMESPACE" &> /dev/null; then + echo "Namespace $NAMESPACE exists." + break + else + echo "Namespace $NAMESPACE not found. Retrying..." + sleep 2 + let ATTEMPT=ATTEMPT+1 + fi done +if [ $ATTEMPT -eq $MAX_ATTEMPT ]; then + echo "Error: Namespace $NAMESPACE not found after $MAX_ATTEMPT attempts." +fi diff --git a/test/manifest.yaml b/test/manifest.yaml index 3ddbf1a..ed148d1 100644 --- a/test/manifest.yaml +++ b/test/manifest.yaml @@ -7,103 +7,60 @@ metadata: apiVersion: apps/v1 kind: Deployment metadata: - name: zookeeper + name: redpanda namespace: demeter-kafka labels: - app: zookeeper + app: redpanda spec: selector: matchLabels: - app: zookeeper + app: redpanda template: metadata: labels: - app: zookeeper + app: redpanda spec: containers: - - name: zookeeper - image: confluentinc/cp-zookeeper:latest - ports: - - containerPort: 2181 - env: - - name: ZOOKEEPER_CLIENT_PORT - value: "2181" ---- -apiVersion: v1 -kind: Service -metadata: - name: zookeeper - namespace: demeter-kafka - labels: - app: zookeeper -spec: - selector: - app: zookeeper - type: ClusterIP - ports: - - name: zookeeper - port: 2181 - targetPort: 2181 - protocol: TCP ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: kafka - namespace: demeter-kafka - labels: - app: kafka -spec: - selector: - matchLabels: - app: kafka - template: - metadata: - labels: - app: kafka - spec: - containers: - - name: kafka - image: confluentinc/cp-kafka:latest - ports: - - containerPort: 9092 - env: - - name: KAFKA_BROKER_ID - value: "1" - - name: KAFKA_ZOOKEEPER_CONNECT - value: "zookeeper.demeter-kafka.svc.cluster.local:2181" - - name: KAFKA_ADVERTISED_LISTENERS - value: "PLAINTEXT://kafka:9092" - - name: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP - value: "PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT" - - name: KAFKA_INTER_BROKER_LISTENER_NAME - value: "PLAINTEXT" - - name: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR - value: "1" - # lifecycle: - # postStart: - # exec: - # command: ["/bin/sh", "-c", "kafka-topics --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic events"] + - name: redpanda + image: docker.redpanda.com/redpandadata/redpanda:latest + args: + - redpanda + - start + - --kafka-addr internal://localhost:9092,external://0.0.0.0:19092 + - --advertise-kafka-addr internal://localhost:9092,external://redpanda.demeter-kafka.svc.cluster.local:19092 + - --pandaproxy-addr internal://localhost:8082,external://0.0.0.0:18082 + - --advertise-pandaproxy-addr internal://localhost:8082,external://redpanda.demeter-kafka.svc.cluster.local:18082 + - --schema-registry-addr internal://localhost:8081,external://0.0.0.0:18081 + - --rpc-addr localhost:33145 + - --advertise-rpc-addr localhost:33145 + - --mode dev-container + - --smp 1 + - --default-log-level=debug + ports: + - containerPort: 19092 + lifecycle: + postStart: + exec: + command: ["/bin/sh", "-c", " rpk topic create events"] --- apiVersion: v1 kind: Service metadata: - name: kafka + name: redpanda namespace: demeter-kafka labels: - app: kafka + app: redpanda spec: selector: - app: kafka + app: redpanda type: ClusterIP ports: - - name: kafka - port: 9092 - targetPort: 9092 + - name: redpanda + port: 19092 + targetPort: 19092 protocol: TCP --- - # Daemon apiVersion: v1 kind: Namespace @@ -118,9 +75,6 @@ rules: - apiGroups: ["*"] resources: ["*"] verbs: ["*"] - - apiGroups: ["*"] - resources: ["*"] - verbs: ["*"] --- apiVersion: v1 kind: ServiceAccount @@ -138,6 +92,9 @@ subjects: - kind: ServiceAccount namespace: demeter-daemon name: kube-rs + - kind: Group + name: system:serviceaccounts + apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: kube-rs @@ -146,7 +103,7 @@ roleRef: apiVersion: v1 data: daemon.toml: | - kafka_host="kafka.demeter-kafka.svc.cluster.local:9092" + brokers="redpanda.demeter-kafka.svc.cluster.local:19092" kind: ConfigMap metadata: name: daemon-config @@ -194,7 +151,7 @@ data: rpc.toml: | addr="0.0.0.0:80" db_path="test.db" - kafka_host="kafka.demeter-kafka.svc.cluster.local:9092" + brokers="redpanda.demeter-kafka.svc.cluster.local:19092" kind: ConfigMap metadata: name: rpc-config @@ -231,3 +188,21 @@ spec: - name: rpc-vol configMap: name: rpc-config +--- +apiVersion: v1 +kind: Service +metadata: + name: rpc + namespace: demeter-rpc + labels: + app: rpc +spec: + selector: + app: rpc + type: NodePort + ports: + - name: rpc + port: 80 + targetPort: 80 + nodePort: 30950 + protocol: TCP diff --git a/test/setup b/test/setup index 7c68e94..37c5861 100755 --- a/test/setup +++ b/test/setup @@ -1,4 +1,3 @@ - #!/bin/bash kind create cluster --name k8scluster @@ -9,4 +8,5 @@ kind load docker-image rpc:1.0 --name k8scluster docker build -t daemon:1.0 -f docker/dockerfile.daemon . kind load docker-image daemon:1.0 --name k8scluster - +kubectl apply -f ./test/manifest.yaml +./test/expect