From cf92b46ce6d3d5457e5f4c9354793b86cb70e74c Mon Sep 17 00:00:00 2001 From: mr Date: Mon, 28 Apr 2025 14:39:53 +0200 Subject: [PATCH] data --- Dockerfile | 4 + controllers/booking.go | 19 ++--- datacenter.json | 5 +- docker-compose.yml | 3 + docker_datacenter.json | 6 +- env.env | 4 + infrastructure/kubernetes.go | 139 +++++++++++++++++------------------ main.go | 3 +- 8 files changed, 88 insertions(+), 95 deletions(-) create mode 100644 env.env diff --git a/Dockerfile b/Dockerfile index d7aa9c2..633e59b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,5 @@ +ARG KUBERNETES_HOST=${KUBERNETES_HOST:-"127.0.0.1"} + FROM golang:alpine AS deps WORKDIR /app @@ -39,6 +41,8 @@ RUN sed -i 's/http:\/\/127.0.0.1:8080\/swagger\/swagger.json/swagger.json/g' /ap FROM golang:alpine +ENV KUBERNETES_SERVICE_HOST=$KUBERNETES_HOST + WORKDIR /app COPY --from=builder /app/extracted/oc-datacenter /usr/bin/ COPY --from=builder /app/extracted/swagger /app/swagger diff --git a/controllers/booking.go b/controllers/booking.go index c9885de..985689c 100644 --- a/controllers/booking.go +++ b/controllers/booking.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "oc-datacenter/infrastructure" - "strings" "time" oclib "cloud.o-forge.io/core/oc-lib" @@ -247,19 +246,11 @@ func (o *BookingController) Post() { o.ServeJSON() return } - if err := o.createNamespace(resp.ExecutionsID); err != nil { - if strings.Contains(err.Error(), "already exists") { - err = nil - } else { - o.Data["json"] = map[string]interface{}{ - "data": nil, - "code": 500, - "error": err.Error(), - } - o.ServeJSON() - return - } - } + + /*if err := o.createNamespace(resp.ExecutionsID); err != nil { + fmt.Println(err.Error()) + }*/ + o.Data["json"] = map[string]interface{}{ "data": []interface{}{b}, "code": 200, diff --git a/datacenter.json b/datacenter.json index 8e206a4..b32b77d 100644 --- a/datacenter.json +++ b/datacenter.json @@ -3,8 +3,5 @@ "NATS_URL": "nats://localhost:4222", "MONGO_DATABASE": "DC_myDC", "KUBERNETES_SERVICE_HOST": "172.16.0.183", - "port": "8092", - "KUBE_CA": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJlRENDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUzTXpnNE5UazJNVFl3SGhjTk1qVXdNakEyTVRZek16TTJXaGNOTXpVd01qQTBNVFl6TXpNMgpXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUzTXpnNE5UazJNVFl3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFSbi9jVmNUb1orekZUdWZSL29qbG5JMnVpZXJYeTkxcWhxYWpHdWVobXYKV1A4NVQ1dXpkcE1rcFhrNnB5bTlFU0RlRjk1WDFkeTJqdjVFR3paZzZ2WWtvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVXJRK0xUR2NMNXBENnBxSEozaVh5CmZiMFRQUDR3Q2dZSUtvWkl6ajBFQXdJRFNRQXdSZ0loQUlObXp3ejhOUVRCNFlURlZJd3BudDhpQjJ5alRlQjYKbkZxRUN6SWw0amUzQWlFQW04dzRma1h0UEhzUG1Yc0hhUXFGSkhkUm9SQ1pSa016akU3REdZY1lMNVE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", - "KUBE_CERT": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrVENDQVRlZ0F3SUJBZ0lJYVlyeG5xbm54WEl3Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1kKYXpOekxXTnNhV1Z1ZEMxallVQXhOek00T0RVNU5qRTJNQjRYRFRJMU1ESXdOakUyTXpNek5sb1hEVEkyTURJdwpOakUyTXpNek5sb3dNREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGVEFUQmdOVkJBTVRESE41CmMzUmxiVHBoWkcxcGJqQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJHeDVVb1Ura01obE9xeHgKTjhRV1FOOGF1ekxXRHpjZTBVbnRYWFdHUmFvWHdHdnlYUldkaFlQcVNoU0xJVGttMG5GV2t5cEZlNUdXTXJlVApZd0hReE9talNEQkdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFmCkJnTlZIU01FR0RBV2dCU0ZlbDVtUXNEaW1vMCtEUzZZZWM1QXdDRXFWREFLQmdncWhrak9QUVFEQWdOSUFEQkYKQWlFQWs3U3UrV3RmQks4SmVPazRreVFVdEFtMkxoak8zV25qOW5SdW9HbVpyTGdDSUJwdVNnNU5oMjUrYm1xMgpZQ2xEM3NLTGdQM1ZKUitCYytxS3h3UjVHbmJwCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkekNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdFkyeHAKWlc1MExXTmhRREUzTXpnNE5UazJNVFl3SGhjTk1qVXdNakEyTVRZek16TTJXaGNOTXpVd01qQTBNVFl6TXpNMgpXakFqTVNFd0h3WURWUVFEREJock0zTXRZMnhwWlc1MExXTmhRREUzTXpnNE5UazJNVFl3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFSTDJSZ1U5RHJZazhKUm4xeDlWSVI3eU5hdWVjaFZuK1pRdDVyeDZaalYKeFRSd0RFT0xXZ1MvbkNpYkp6eUVFNmhLUDVzczBPdnp0ZzlxeFZYU1orNzBvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWhYcGVaa0xBNHBxTlBnMHVtSG5PClFNQWhLbFF3Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUlnS09hYVMyczRSWWgrU3J0TXpXTnVtVHduajlKOTZuWUkKL0prdEhjNU5lQnNDSVFDbTY5a1U3cDA5V3hHYWdkNmRQbUlOQ09Fa2V2bzZoQ0dNQTNpd0ZlZ3BiQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", - "KUBE_DATA": "LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSU0yYUxXTmtPQ2ZGRTJxM2V1VE9kaHd0RXdxTWRaVUZTTlRPOG50OER0K1RvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFYkhsU2hUNlF5R1U2ckhFM3hCWkEzeHE3TXRZUE54N1JTZTFkZFlaRnFoZkFhL0pkRloyRgpnK3BLRklzaE9TYlNjVmFUS2tWN2taWXl0NU5qQWRERTZRPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo=" + "port": "8092" } \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index f3effaa..e91ff9b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,6 +2,9 @@ version: '3.4' services: oc-datacenter: + env_file: + - path: ./env.env + required: false environment: - MONGO_DATABASE=DC_myDC image: 'oc-datacenter:latest' diff --git a/docker_datacenter.json b/docker_datacenter.json index 84ab28a..1f9013e 100644 --- a/docker_datacenter.json +++ b/docker_datacenter.json @@ -1,9 +1,5 @@ { "MONGO_URL":"mongodb://mongo:27017/", "NATS_URL":"nats://nats:4222", - "MONGO_DATABASE":"DC_myDC", - "KUBERNETES_SERVICE_HOST" : "172.16.0.181", - "KUBE_CA" : "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJlRENDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUzTXpnNE5UazJNVFl3SGhjTk1qVXdNakEyTVRZek16TTJXaGNOTXpVd01qQTBNVFl6TXpNMgpXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUzTXpnNE5UazJNVFl3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFSbi9jVmNUb1orekZUdWZSL29qbG5JMnVpZXJYeTkxcWhxYWpHdWVobXYKV1A4NVQ1dXpkcE1rcFhrNnB5bTlFU0RlRjk1WDFkeTJqdjVFR3paZzZ2WWtvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVXJRK0xUR2NMNXBENnBxSEozaVh5CmZiMFRQUDR3Q2dZSUtvWkl6ajBFQXdJRFNRQXdSZ0loQUlObXp3ejhOUVRCNFlURlZJd3BudDhpQjJ5alRlQjYKbkZxRUN6SWw0amUzQWlFQW04dzRma1h0UEhzUG1Yc0hhUXFGSkhkUm9SQ1pSa016akU3REdZY1lMNVE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", - "KUBE_CERT":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrVENDQVRlZ0F3SUJBZ0lJYVlyeG5xbm54WEl3Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1kKYXpOekxXTnNhV1Z1ZEMxallVQXhOek00T0RVNU5qRTJNQjRYRFRJMU1ESXdOakUyTXpNek5sb1hEVEkyTURJdwpOakUyTXpNek5sb3dNREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGVEFUQmdOVkJBTVRESE41CmMzUmxiVHBoWkcxcGJqQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJHeDVVb1Ura01obE9xeHgKTjhRV1FOOGF1ekxXRHpjZTBVbnRYWFdHUmFvWHdHdnlYUldkaFlQcVNoU0xJVGttMG5GV2t5cEZlNUdXTXJlVApZd0hReE9talNEQkdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFmCkJnTlZIU01FR0RBV2dCU0ZlbDVtUXNEaW1vMCtEUzZZZWM1QXdDRXFWREFLQmdncWhrak9QUVFEQWdOSUFEQkYKQWlFQWs3U3UrV3RmQks4SmVPazRreVFVdEFtMkxoak8zV25qOW5SdW9HbVpyTGdDSUJwdVNnNU5oMjUrYm1xMgpZQ2xEM3NLTGdQM1ZKUitCYytxS3h3UjVHbmJwCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkekNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdFkyeHAKWlc1MExXTmhRREUzTXpnNE5UazJNVFl3SGhjTk1qVXdNakEyTVRZek16TTJXaGNOTXpVd01qQTBNVFl6TXpNMgpXakFqTVNFd0h3WURWUVFEREJock0zTXRZMnhwWlc1MExXTmhRREUzTXpnNE5UazJNVFl3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFSTDJSZ1U5RHJZazhKUm4xeDlWSVI3eU5hdWVjaFZuK1pRdDVyeDZaalYKeFRSd0RFT0xXZ1MvbkNpYkp6eUVFNmhLUDVzczBPdnp0ZzlxeFZYU1orNzBvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWhYcGVaa0xBNHBxTlBnMHVtSG5PClFNQWhLbFF3Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUlnS09hYVMyczRSWWgrU3J0TXpXTnVtVHduajlKOTZuWUkKL0prdEhjNU5lQnNDSVFDbTY5a1U3cDA5V3hHYWdkNmRQbUlOQ09Fa2V2bzZoQ0dNQTNpd0ZlZ3BiQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", - "KUBE_DATA": "LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSU0yYUxXTmtPQ2ZGRTJxM2V1VE9kaHd0RXdxTWRaVUZTTlRPOG50OER0K1RvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFYkhsU2hUNlF5R1U2ckhFM3hCWkEzeHE3TXRZUE54N1JTZTFkZFlaRnFoZkFhL0pkRloyRgpnK3BLRklzaE9TYlNjVmFUS2tWN2taWXl0NU5qQWRERTZRPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo=" + "MONGO_DATABASE":"DC_myDC" } \ No newline at end of file diff --git a/env.env b/env.env new file mode 100644 index 0000000..4a00a82 --- /dev/null +++ b/env.env @@ -0,0 +1,4 @@ +KUBERNETES_SERVICE_HOST=192.168.1.169 +KUBE_CA="LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkekNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUzTWpNeE1USXdNell3SGhjTk1qUXdPREE0TVRBeE16VTJXaGNOTXpRd09EQTJNVEF4TXpVMgpXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUzTWpNeE1USXdNell3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFTVlk3ZHZhNEdYTVdkMy9jMlhLN3JLYjlnWXgyNSthaEE0NmkyNVBkSFAKRktQL2UxSVMyWVF0dzNYZW1TTUQxaStZdzJSaVppNUQrSVZUamNtNHdhcnFvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWtlUVJpNFJiODduME5yRnZaWjZHClc2SU55NnN3Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUlnRXA5ck04WmdNclRZSHYxZjNzOW5DZXZZeWVVa3lZUk4KWjUzazdoaytJS1FDSVFDbk05TnVGKzlTakIzNDFacGZ5ays2NEpWdkpSM3BhcmVaejdMd2lhNm9kdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K" +KUBE_CERT="LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrVENDQVRlZ0F3SUJBZ0lJWUxWNkFPQkdrU1F3Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1kKYXpOekxXTnNhV1Z1ZEMxallVQXhOekl6TVRFeU1ETTJNQjRYRFRJME1EZ3dPREV3TVRNMU5sb1hEVEkxTURndwpPREV3TVRNMU5sb3dNREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGVEFUQmdOVkJBTVRESE41CmMzUmxiVHBoWkcxcGJqQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJGQ2Q1MFdPeWdlQ2syQzcKV2FrOWY4MVAvSkJieVRIajRWOXBsTEo0ck5HeHFtSjJOb2xROFYxdUx5RjBtOTQ2Nkc0RmRDQ2dqaXFVSk92Swp3NVRPNnd5alNEQkdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFmCkJnTlZIU01FR0RBV2dCVFJkOFI5cXVWK2pjeUVmL0ovT1hQSzMyS09XekFLQmdncWhrak9QUVFEQWdOSUFEQkYKQWlFQTArbThqTDBJVldvUTZ0dnB4cFo4NVlMalF1SmpwdXM0aDdnSXRxS3NmUVVDSUI2M2ZNdzFBMm5OVWU1TgpIUGZOcEQwSEtwcVN0Wnk4djIyVzliYlJUNklZCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJlRENDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdFkyeHAKWlc1MExXTmhRREUzTWpNeE1USXdNell3SGhjTk1qUXdPREE0TVRBeE16VTJXaGNOTXpRd09EQTJNVEF4TXpVMgpXakFqTVNFd0h3WURWUVFEREJock0zTXRZMnhwWlc1MExXTmhRREUzTWpNeE1USXdNell3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFRc3hXWk9pbnIrcVp4TmFEQjVGMGsvTDF5cE01VHAxOFRaeU92ektJazQKRTFsZWVqUm9STW0zNmhPeVljbnN3d3JoNnhSUnBpMW5RdGhyMzg0S0Z6MlBvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTBYZkVmYXJsZm8zTWhIL3lmemx6Cnl0OWlqbHN3Q2dZSUtvWkl6ajBFQXdJRFNRQXdSZ0loQUxJL2dNYnNMT3MvUUpJa3U2WHVpRVMwTEE2cEJHMXgKcnBlTnpGdlZOekZsQWlFQW1wdjBubjZqN3M0MVI0QzFNMEpSL0djNE53MHdldlFmZWdEVGF1R2p3cFk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K" +KUBE_DATA="LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSU5ZS1BFb1dhd1NKUzJlRW5oWmlYMk5VZlY1ZlhKV2krSVNnV09TNFE5VTlvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFVUozblJZN0tCNEtUWUx0WnFUMS96VS84a0Z2Sk1lUGhYMm1Vc25pczBiR3FZblkyaVZEeApYVzR2SVhTYjNqcm9iZ1YwSUtDT0twUWs2OHJEbE03ckRBPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo=" \ No newline at end of file diff --git a/infrastructure/kubernetes.go b/infrastructure/kubernetes.go index f3ac221..c8f97bc 100644 --- a/infrastructure/kubernetes.go +++ b/infrastructure/kubernetes.go @@ -195,27 +195,25 @@ func (k *KubernetesService) GenerateToken(ctx context.Context, ns string, durati return token.Status.Token, nil } - - // Needs refactoring : -// - Retrieving the metada (in a method that Unmarshall the part of the json in a metadata object) -func (k *KubernetesService) GetTargets(ctx context.Context) ([]string,error){ +// - Retrieving the metada (in a method that Unmarshall the part of the json in a metadata object) +func (k *KubernetesService) GetTargets(ctx context.Context) ([]string, error) { var listTargets []string - resp, err := getCDRapiKube(*k.Set, ctx,"/apis/multicluster.admiralty.io/v1alpha1/targets") + resp, err := getCDRapiKube(*k.Set, ctx, "/apis/multicluster.admiralty.io/v1alpha1/targets") if err != nil { - return nil,err + return nil, err } fmt.Println(string(resp)) var targetDict map[string]interface{} - err = json.Unmarshal(resp,&targetDict) + err = json.Unmarshal(resp, &targetDict) if err != nil { fmt.Println("TODO: handle the error when unmarshalling k8s API response") return nil, err } - b, _ := json.MarshalIndent(targetDict,""," ") + b, _ := json.MarshalIndent(targetDict, "", " ") fmt.Println(string(b)) data := targetDict["items"].([]interface{}) @@ -224,25 +222,25 @@ func (k *KubernetesService) GetTargets(ctx context.Context) ([]string,error){ var metadata metav1.ObjectMeta item := item.(map[string]interface{}) byteMetada, err := json.Marshal(item["metadata"]) - + if err != nil { fmt.Println("Error while Marshalling metadata field") - return nil,err + return nil, err } - err = json.Unmarshal(byteMetada,&metadata) + err = json.Unmarshal(byteMetada, &metadata) if err != nil { fmt.Println("Error while Unmarshalling metadata field to the library object") - return nil,err + return nil, err } listTargets = append(listTargets, metadata.Name) } - return listTargets,nil + return listTargets, nil } -// Admiralty Target allows a cluster to deploy pods to remote cluster +// Admiralty Target allows a cluster to deploy pods to remote cluster // // The remote cluster must : // @@ -250,20 +248,20 @@ func (k *KubernetesService) GetTargets(ctx context.Context) ([]string,error){ // // - have declared the same namespace as the one where the pods are created in the local cluster // -// - have delcared a serviceAccount with sufficient permission to create pods -func (k *KubernetesService) CreateAdmiraltyTarget(context context.Context,executionId string)([]byte,error){ - exists, err := k.GetKubeconfigSecret(context,executionId) +// - have delcared a serviceAccount with sufficient permission to create pods +func (k *KubernetesService) CreateAdmiraltyTarget(context context.Context, executionId string) ([]byte, error) { + exists, err := k.GetKubeconfigSecret(context, executionId) if err != nil { fmt.Println("Error verifying kube-secret before creating target") return nil, err } if exists == nil { - fmt.Println("Target needs to be binded to a secret in namespace ",executionId) - return nil, nil // Maybe we could create a wrapper for errors and add more info to have + fmt.Println("Target needs to be binded to a secret in namespace ", executionId) + return nil, nil // Maybe we could create a wrapper for errors and add more info to have } - - var targetManifest string + + var targetManifest string var tpl bytes.Buffer tmpl, err := template.New("target"). Parse("{\"apiVersion\": \"multicluster.admiralty.io/v1alpha1\", \"kind\": \"Target\", \"metadata\": {\"name\": \"target-{{.ExecutionId}}\"}, \"spec\": { \"kubeconfigSecret\" :{\"name\": \"kube-secret-{{.ExecutionId}}\"}} }") @@ -272,26 +270,25 @@ func (k *KubernetesService) CreateAdmiraltyTarget(context context.Context,execut return nil, err } - err = tmpl.Execute(&tpl, map[string]string{"ExecutionId":executionId}) + err = tmpl.Execute(&tpl, map[string]string{"ExecutionId": executionId}) targetManifest = tpl.String() resp, err := postCDRapiKube( *k.Set, context, - "/apis/multicluster.admiralty.io/v1alpha1/namespaces/"+ executionId +"/targets", + "/apis/multicluster.admiralty.io/v1alpha1/namespaces/"+executionId+"/targets", []byte(targetManifest), - map[string]string{"fieldManager":"kubectl-client-side-apply"}, - map[string]string{"fieldValidation":"Strict"}, + map[string]string{"fieldManager": "kubectl-client-side-apply"}, + map[string]string{"fieldValidation": "Strict"}, ) if err != nil { - fmt.Println("Error trying to create a Source on remote cluster : ", err , " : ", resp) + fmt.Println("Error trying to create a Source on remote cluster : ", err, " : ", resp) return nil, err } return resp, nil } - // Admiralty Source allows a cluster to receive pods from a remote cluster // // The source must be associated to a serviceAccount, which will execute the pods locally. @@ -300,8 +297,8 @@ func (k *KubernetesService) CreateAdmiraltyTarget(context context.Context,execut // This method is temporary to implement the use of Admiralty, but must be edited // to rather contact the oc-datacenter from the remote cluster to create the source // locally and retrieve the token for the serviceAccount -func (k *KubernetesService) CreateAdmiraltySource(context context.Context,executionId string) ([]byte, error) { - var sourceManifest string +func (k *KubernetesService) CreateAdmiraltySource(context context.Context, executionId string) ([]byte, error) { + var sourceManifest string var tpl bytes.Buffer tmpl, err := template.New("source"). Parse("{\"apiVersion\": \"multicluster.admiralty.io/v1alpha1\", \"kind\": \"Source\", \"metadata\": {\"name\": \"source-{{.ExecutionId}}\"}, \"spec\": {\"serviceAccountName\": \"sa-{{.ExecutionId}}\"} }") @@ -310,21 +307,21 @@ func (k *KubernetesService) CreateAdmiraltySource(context context.Context,execut return nil, err } - err = tmpl.Execute(&tpl, map[string]string{"ExecutionId":executionId}) + err = tmpl.Execute(&tpl, map[string]string{"ExecutionId": executionId}) sourceManifest = tpl.String() - + resp, err := postCDRapiKube( *k.Set, context, - "/apis/multicluster.admiralty.io/v1alpha1/namespaces/"+ executionId +"/sources", + "/apis/multicluster.admiralty.io/v1alpha1/namespaces/"+executionId+"/sources", []byte(sourceManifest), - map[string]string{"fieldManager":"kubectl-client-side-apply"}, - map[string]string{"fieldValidation":"Strict"}, + map[string]string{"fieldManager": "kubectl-client-side-apply"}, + map[string]string{"fieldValidation": "Strict"}, ) // We can add more info to the log with the content of resp if not nil if err != nil { - fmt.Println("Error trying to create a Source on remote cluster : ", err , " : ", resp) + fmt.Println("Error trying to create a Source on remote cluster : ", err, " : ", resp) return nil, err } @@ -333,7 +330,7 @@ func (k *KubernetesService) CreateAdmiraltySource(context context.Context,execut // Create a secret from a kubeconfing. Use it to create the secret binded to an Admiralty // target, which must contain the serviceAccount's token value -func (k *KubernetesService) CreateKubeconfigSecret(context context.Context,kubeconfig string, executionId string) ([]byte, error) { +func (k *KubernetesService) CreateKubeconfigSecret(context context.Context, kubeconfig string, executionId string) ([]byte, error) { config, err := base64.StdEncoding.DecodeString(kubeconfig) // config, err := base64.RawStdEncoding.DecodeString(kubeconfig) if err != nil { @@ -345,14 +342,14 @@ func (k *KubernetesService) CreateKubeconfigSecret(context context.Context,kubec secretManifest := &v1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: "kube-secret-" + executionId, - Namespace: executionId, + Namespace: executionId, }, Data: map[string][]byte{ "config": config, }, } - exists, err := k.GetKubeconfigSecret(context,executionId) + exists, err := k.GetKubeconfigSecret(context, executionId) if err != nil { fmt.Println("Error verifying if kube secret exists in namespace ", executionId) return nil, err @@ -366,11 +363,11 @@ func (k *KubernetesService) CreateKubeconfigSecret(context context.Context,kubec _ = err } resp, err := k.Set.CoreV1(). - Secrets(executionId). - Create(context,secretManifest,metav1.CreateOptions{}) - + Secrets(executionId). + Create(context, secretManifest, metav1.CreateOptions{}) + if err != nil { - fmt.Println("Error while trying to contact API to get secret kube-secret-"+executionId) + fmt.Println("Error while trying to contact API to get secret kube-secret-" + executionId) fmt.Println(err) return nil, err } @@ -382,19 +379,19 @@ func (k *KubernetesService) CreateKubeconfigSecret(context context.Context,kubec return nil, err } return data, nil -} +} -func (k *KubernetesService) GetKubeconfigSecret(context context.Context,executionId string) ([]byte, error) { +func (k *KubernetesService) GetKubeconfigSecret(context context.Context, executionId string) ([]byte, error) { resp, err := k.Set.CoreV1(). - Secrets(executionId). - Get(context,"kube-secret-"+executionId,metav1.GetOptions{}) + Secrets(executionId). + Get(context, "kube-secret-"+executionId, metav1.GetOptions{}) if err != nil { - if(apierrors.IsNotFound(err)){ + if apierrors.IsNotFound(err) { fmt.Println("kube-secret not found for execution", executionId) return nil, nil } - fmt.Println("Error while trying to contact API to get secret kube-secret-"+executionId) + fmt.Println("Error while trying to contact API to get secret kube-secret-" + executionId) fmt.Println(err) return nil, err } @@ -410,41 +407,41 @@ func (k *KubernetesService) GetKubeconfigSecret(context context.Context,executio return data, nil } -func (k *KubernetesService) DeleteKubeConfigSecret(executionID string) ([]byte, error){ +func (k *KubernetesService) DeleteKubeConfigSecret(executionID string) ([]byte, error) { return []byte{}, nil } -func getCDRapiKube(client kubernetes.Clientset, ctx context.Context, path string) ([]byte,error) { +func getCDRapiKube(client kubernetes.Clientset, ctx context.Context, path string) ([]byte, error) { resp, err := client.RESTClient().Get(). - AbsPath(path). - DoRaw(ctx) // from https://stackoverflow.com/questions/60764908/how-to-access-kubernetes-crd-using-client-go + AbsPath(path). + DoRaw(ctx) // from https://stackoverflow.com/questions/60764908/how-to-access-kubernetes-crd-using-client-go if err != nil { - fmt.Println("Error from k8s API when getting " + path + " : " , err) - return nil,err + fmt.Println("Error from k8s API when getting "+path+" : ", err) + return nil, err } return resp, nil } -func postCDRapiKube(client kubernetes.Clientset, ctx context.Context, path string, body []byte, params ...map[string]string) ([]byte, error){ +func postCDRapiKube(client kubernetes.Clientset, ctx context.Context, path string, body []byte, params ...map[string]string) ([]byte, error) { req := client.RESTClient(). - Post(). - AbsPath(path). - Body(body) + Post(). + AbsPath(path). + Body(body) for _, param := range params { - for k,v := range param { - req = req.Param(k,v) + for k, v := range param { + req = req.Param(k, v) } } - + resp, err := req.DoRaw(ctx) if err != nil { - fmt.Println("Error from k8s API when posting " + string(body) + " to " + path + " : " , err) - return nil,err + fmt.Println("Error from k8s API when posting "+string(body)+" to "+path+" : ", err) + return nil, err } return resp, nil @@ -453,13 +450,13 @@ func postCDRapiKube(client kubernetes.Clientset, ctx context.Context, path strin // Returns the Kubernetes' Node object corresponding to the executionID if it exists on this host // // The node is created when an admiralty Target (on host) can connect to an admiralty Source (on remote) -func (k *KubernetesService) GetOneNode(context context.Context,executionID string) (*v1.Node, error) { +func (k *KubernetesService) GetOneNode(context context.Context, executionID string) (*v1.Node, error) { res, err := k.Set.CoreV1(). - Nodes(). - List( - context, - metav1.ListOptions{}, - ) + Nodes(). + List( + context, + metav1.ListOptions{}, + ) if err != nil { fmt.Println("Error getting the list of nodes from k8s API") fmt.Println(err) @@ -467,10 +464,10 @@ func (k *KubernetesService) GetOneNode(context context.Context,executionID strin } for _, node := range res.Items { - if isNode := strings.Contains(node.Name,"admiralty-"+executionID+"-target-"+executionID+"-"); isNode { + if isNode := strings.Contains(node.Name, "admiralty-"+executionID+"-target-"+executionID+"-"); isNode { return &node, nil } } return nil, nil -} \ No newline at end of file +} diff --git a/main.go b/main.go index 5971b56..b360134 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "encoding/base64" "oc-datacenter/conf" _ "oc-datacenter/routers" + "os" oclib "cloud.o-forge.io/core/oc-lib" "cloud.o-forge.io/core/oc-lib/tools" @@ -20,7 +21,7 @@ func main() { // Load the right config file o := oclib.GetConfLoader() conf.GetConfig().Mode = o.GetStringDefault("MODE", "kubernetes") - conf.GetConfig().KubeHost = o.GetStringDefault("KUBERNETES_SERVICE_HOST", "") + conf.GetConfig().KubeHost = o.GetStringDefault("KUBERNETES_SERVICE_HOST", os.Getenv("KUBERNETES_SERVICE_HOST")) conf.GetConfig().KubePort = o.GetStringDefault("KUBERNETES_SERVICE_PORT", "6443") sDec, err := base64.StdEncoding.DecodeString(o.GetStringDefault("KUBE_CA", ""))