Compare commits
	
		
			2 Commits
		
	
	
		
			feature/ad
			...
			e4f0f6f4ca
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e4f0f6f4ca | |||
| cf92b46ce6 | 
@@ -1,3 +1,5 @@
 | 
			
		||||
ARG KUBERNETES_HOST=${KUBERNETES_HOST:-"127.0.0.1"}
 | 
			
		||||
 | 
			
		||||
FROM golang:alpine AS deps
 | 
			
		||||
 | 
			
		||||
WORKDIR /app
 | 
			
		||||
@@ -28,7 +30,7 @@ RUN export CGO_ENABLED=0 && \
 | 
			
		||||
COPY . .
 | 
			
		||||
 | 
			
		||||
RUN sed -i '/replace/d' go.mod
 | 
			
		||||
RUN if [ ! -f swagger/index.html ]; then timeout 15 bee run -gendoc=true -downdoc=true; fi
 | 
			
		||||
RUN if [ ! -f swagger/index.html ]; then timeout 15 bee run --gendoc=true --downdoc=true; fi
 | 
			
		||||
RUN bee generate routers
 | 
			
		||||
RUN bee generate docs
 | 
			
		||||
RUN bee pack
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -10,13 +10,10 @@ import (
 | 
			
		||||
	"slices"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	oclib "cloud.o-forge.io/core/oc-lib"
 | 
			
		||||
 | 
			
		||||
	beego "github.com/beego/beego/v2/server/web"
 | 
			
		||||
	jwt "github.com/golang-jwt/jwt/v5"
 | 
			
		||||
	"gopkg.in/yaml.v2"
 | 
			
		||||
	v1 "k8s.io/api/core/v1"
 | 
			
		||||
	apierrors "k8s.io/apimachinery/pkg/api/errors"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type KubeInfo struct {
 | 
			
		||||
@@ -142,12 +139,6 @@ func (c *AdmiraltyController) CreateSource() {
 | 
			
		||||
 | 
			
		||||
	res, err := serv.CreateAdmiraltySource(c.Ctx.Request.Context(),execution)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if apierrors.IsAlreadyExists(err) {
 | 
			
		||||
			c.Ctx.Output.SetStatus(409)
 | 
			
		||||
			c.Data["json"] = map[string]string{"info" : "A source already exists for this namespace : " + execution}
 | 
			
		||||
			c.ServeJSON()
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		// change code to 500
 | 
			
		||||
		c.Ctx.Output.SetStatus(500)
 | 
			
		||||
		c.Data["json"] = map[string]string{"error": err.Error()}
 | 
			
		||||
@@ -324,6 +315,7 @@ func (c *AdmiraltyController) CreateKubeSecret() {
 | 
			
		||||
// @router /node/:execution [get]
 | 
			
		||||
func (c *AdmiraltyController) GetNodeReady(){
 | 
			
		||||
	var secret v1.Secret
 | 
			
		||||
	
 | 
			
		||||
	execution := c.Ctx.Input.Param(":execution")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -347,14 +339,12 @@ func (c *AdmiraltyController) GetNodeReady(){
 | 
			
		||||
	if node == nil {
 | 
			
		||||
		c.Ctx.Output.SetStatus(404)
 | 
			
		||||
		c.Data["json"] = map[string]string{
 | 
			
		||||
			"node" : "the node for " + execution + " can't be found, make sure both target and source resources are set up on local and remote hosts",
 | 
			
		||||
			"error" : "the node for " + execution + " can't be found, make sure both target and source resources are set up on local and remote hosts",
 | 
			
		||||
		}
 | 
			
		||||
		c.ServeJSON()
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	resp, err := serv.GetKubeconfigSecret(c.Ctx.Request.Context(),execution)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		// change code to 500
 | 
			
		||||
@@ -369,6 +359,7 @@ func (c *AdmiraltyController) GetNodeReady(){
 | 
			
		||||
		c.ServeJSON()
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	// Extract JWT token RS265 encoded
 | 
			
		||||
	var editedKubeconfig map[string]interface{}
 | 
			
		||||
@@ -402,15 +393,14 @@ func (c *AdmiraltyController) GetNodeReady(){
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if *isExpired {
 | 
			
		||||
		c.Data["json"] = map[string]interface{}{
 | 
			
		||||
		c.Data["json"] = map[string]string{
 | 
			
		||||
			"token" : "token in the secret is expired and must be regenerated",
 | 
			
		||||
			"node": node,
 | 
			
		||||
		}
 | 
			
		||||
		c.Ctx.Output.SetStatus(410)
 | 
			
		||||
		c.ServeJSON()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.Data["json"] = map[string]interface{}{"node": node,"token": true}
 | 
			
		||||
	c.Data["json"] = map[string]bool{"ok": true}
 | 
			
		||||
	c.ServeJSON()
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
@@ -436,8 +426,6 @@ func retrieveTokenFromKonfig(editedKubeconfig map[string]interface{}) (string,er
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isTokenExpired(token string) (*bool, error){
 | 
			
		||||
	logger := oclib.GetLogger()
 | 
			
		||||
 | 
			
		||||
	t, _, err := new(jwt.Parser).ParseUnverified(token, jwt.MapClaims{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println("couldn't decode token")
 | 
			
		||||
@@ -449,11 +437,7 @@ func isTokenExpired(token string) (*bool, error){
 | 
			
		||||
		fmt.Println("Error while checking token's expiration time")
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	logger.Debug().Msg("Expiration date : " + expiration.UTC().Format("2006-01-02T15:04:05"))
 | 
			
		||||
	logger.Debug().Msg(fmt.Sprint("Now : ", time.Now().Unix()))
 | 
			
		||||
	logger.Debug().Msg(fmt.Sprint("Token : ", expiration.Unix()))
 | 
			
		||||
 | 
			
		||||
	fmt.Println("Expiration date : " + expiration.UTC().Format("2006-01-02T15:04:05"))
 | 
			
		||||
 | 
			
		||||
	expired := expiration.Unix() < time.Now().Unix()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
 
 | 
			
		||||
@@ -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"
 | 
			
		||||
}
 | 
			
		||||
@@ -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'
 | 
			
		||||
 
 | 
			
		||||
@@ -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"    
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										4
									
								
								env.env
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								env.env
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
KUBERNETES_SERVICE_HOST=192.168.1.169
 | 
			
		||||
KUBE_CA="LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkekNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUzTWpNeE1USXdNell3SGhjTk1qUXdPREE0TVRBeE16VTJXaGNOTXpRd09EQTJNVEF4TXpVMgpXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUzTWpNeE1USXdNell3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFTVlk3ZHZhNEdYTVdkMy9jMlhLN3JLYjlnWXgyNSthaEE0NmkyNVBkSFAKRktQL2UxSVMyWVF0dzNYZW1TTUQxaStZdzJSaVppNUQrSVZUamNtNHdhcnFvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWtlUVJpNFJiODduME5yRnZaWjZHClc2SU55NnN3Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUlnRXA5ck04WmdNclRZSHYxZjNzOW5DZXZZeWVVa3lZUk4KWjUzazdoaytJS1FDSVFDbk05TnVGKzlTakIzNDFacGZ5ays2NEpWdkpSM3BhcmVaejdMd2lhNm9kdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
 | 
			
		||||
KUBE_CERT="LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrVENDQVRlZ0F3SUJBZ0lJWUxWNkFPQkdrU1F3Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1kKYXpOekxXTnNhV1Z1ZEMxallVQXhOekl6TVRFeU1ETTJNQjRYRFRJME1EZ3dPREV3TVRNMU5sb1hEVEkxTURndwpPREV3TVRNMU5sb3dNREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGVEFUQmdOVkJBTVRESE41CmMzUmxiVHBoWkcxcGJqQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJGQ2Q1MFdPeWdlQ2syQzcKV2FrOWY4MVAvSkJieVRIajRWOXBsTEo0ck5HeHFtSjJOb2xROFYxdUx5RjBtOTQ2Nkc0RmRDQ2dqaXFVSk92Swp3NVRPNnd5alNEQkdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFmCkJnTlZIU01FR0RBV2dCVFJkOFI5cXVWK2pjeUVmL0ovT1hQSzMyS09XekFLQmdncWhrak9QUVFEQWdOSUFEQkYKQWlFQTArbThqTDBJVldvUTZ0dnB4cFo4NVlMalF1SmpwdXM0aDdnSXRxS3NmUVVDSUI2M2ZNdzFBMm5OVWU1TgpIUGZOcEQwSEtwcVN0Wnk4djIyVzliYlJUNklZCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJlRENDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdFkyeHAKWlc1MExXTmhRREUzTWpNeE1USXdNell3SGhjTk1qUXdPREE0TVRBeE16VTJXaGNOTXpRd09EQTJNVEF4TXpVMgpXakFqTVNFd0h3WURWUVFEREJock0zTXRZMnhwWlc1MExXTmhRREUzTWpNeE1USXdNell3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFRc3hXWk9pbnIrcVp4TmFEQjVGMGsvTDF5cE01VHAxOFRaeU92ektJazQKRTFsZWVqUm9STW0zNmhPeVljbnN3d3JoNnhSUnBpMW5RdGhyMzg0S0Z6MlBvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTBYZkVmYXJsZm8zTWhIL3lmemx6Cnl0OWlqbHN3Q2dZSUtvWkl6ajBFQXdJRFNRQXdSZ0loQUxJL2dNYnNMT3MvUUpJa3U2WHVpRVMwTEE2cEJHMXgKcnBlTnpGdlZOekZsQWlFQW1wdjBubjZqN3M0MVI0QzFNMEpSL0djNE53MHdldlFmZWdEVGF1R2p3cFk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
 | 
			
		||||
KUBE_DATA="LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSU5ZS1BFb1dhd1NKUzJlRW5oWmlYMk5VZlY1ZlhKV2krSVNnV09TNFE5VTlvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFVUozblJZN0tCNEtUWUx0WnFUMS96VS84a0Z2Sk1lUGhYMm1Vc25pczBiR3FZblkyaVZEeApYVzR2SVhTYjNqcm9iZ1YwSUtDT0twUWs2OHJEbE03ckRBPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo="
 | 
			
		||||
@@ -1,11 +1,13 @@
 | 
			
		||||
package infrastructure
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/base64"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"html/template"
 | 
			
		||||
	"oc-datacenter/conf"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
@@ -14,40 +16,12 @@ import (
 | 
			
		||||
	rbacv1 "k8s.io/api/rbac/v1"
 | 
			
		||||
	apierrors "k8s.io/apimachinery/pkg/api/errors"
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
			
		||||
	apply "k8s.io/client-go/applyconfigurations/core/v1"
 | 
			
		||||
	"k8s.io/client-go/dynamic"
 | 
			
		||||
	"k8s.io/client-go/kubernetes"
 | 
			
		||||
	"k8s.io/client-go/rest"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var gvrSources = schema.GroupVersionResource{Group: "multicluster.admiralty.io", Version: "v1alpha1", Resource: "sources"}
 | 
			
		||||
var gvrTargets = schema.GroupVersionResource{Group: "multicluster.admiralty.io", Version: "v1alpha1", Resource: "targets"}
 | 
			
		||||
 | 
			
		||||
type KubernetesService struct {
 | 
			
		||||
	Set 			*kubernetes.Clientset
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewDynamicClient() (*dynamic.DynamicClient, error) {
 | 
			
		||||
	config := &rest.Config{
 | 
			
		||||
		Host: conf.GetConfig().KubeHost + ":" + conf.GetConfig().KubePort,
 | 
			
		||||
		TLSClientConfig: rest.TLSClientConfig{
 | 
			
		||||
			CAData:   []byte(conf.GetConfig().KubeCA),
 | 
			
		||||
			CertData: []byte(conf.GetConfig().KubeCert),
 | 
			
		||||
			KeyData:  []byte(conf.GetConfig().KubeData),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dynamicClient, err := dynamic.NewForConfig(config)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.New("Error creating Dynamic client: " + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
	if dynamicClient == nil {
 | 
			
		||||
		return nil, errors.New("Error creating Dynamic client: dynamicClient is nil")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return dynamicClient, nil
 | 
			
		||||
	Set *kubernetes.Clientset
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewKubernetesService() (Infrastructure, error) {
 | 
			
		||||
@@ -59,7 +33,6 @@ func NewKubernetesService() (Infrastructure, error) {
 | 
			
		||||
			KeyData:  []byte(conf.GetConfig().KubeData),
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	// Create clientset
 | 
			
		||||
	clientset, err := kubernetes.NewForConfig(config)
 | 
			
		||||
	fmt.Println("NewForConfig", clientset, err)
 | 
			
		||||
@@ -70,7 +43,6 @@ func NewKubernetesService() (Infrastructure, error) {
 | 
			
		||||
		return nil, errors.New("Error creating Kubernetes client: clientset is nil")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	return &KubernetesService{
 | 
			
		||||
		Set: clientset,
 | 
			
		||||
	}, nil
 | 
			
		||||
@@ -110,9 +82,6 @@ func (k *KubernetesService) CreateNamespace(ctx context.Context, ns string) erro
 | 
			
		||||
	namespace := &v1.Namespace{
 | 
			
		||||
		ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
			Name: ns,
 | 
			
		||||
			Labels: map[string]string{
 | 
			
		||||
				"multicluster-scheduler":"enabled",
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	// Create the namespace
 | 
			
		||||
@@ -226,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{})
 | 
			
		||||
@@ -255,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 :
 | 
			
		||||
//
 | 
			
		||||
@@ -281,44 +248,47 @@ 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
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	target := map[string]interface{}{
 | 
			
		||||
        "apiVersion": "multicluster.admiralty.io/v1alpha1",
 | 
			
		||||
        "kind":       "Target",
 | 
			
		||||
        "metadata": map[string]interface{}{
 | 
			
		||||
            "name":      "target-"+executionId,
 | 
			
		||||
            "namespace": executionId,
 | 
			
		||||
        },
 | 
			
		||||
        "spec": map[string]interface{}{
 | 
			
		||||
            "kubeconfigSecret": map[string]string{
 | 
			
		||||
				"name" : "kube-secret-"+executionId,
 | 
			
		||||
			},
 | 
			
		||||
        },
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	res, err := dynamicClientApply(executionId, "target", gvrTargets, context, target)
 | 
			
		||||
	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}}\"}} }")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.New("Error when trying to apply Source definition :" + err.Error())
 | 
			
		||||
		fmt.Println("Error creating the template for the target Manifest")
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return res, nil
 | 
			
		||||
	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",
 | 
			
		||||
		[]byte(targetManifest),
 | 
			
		||||
		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)
 | 
			
		||||
		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.
 | 
			
		||||
@@ -327,32 +297,40 @@ 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) {
 | 
			
		||||
 | 
			
		||||
	source := map[string]interface{}{
 | 
			
		||||
        "apiVersion": "multicluster.admiralty.io/v1alpha1",
 | 
			
		||||
        "kind":       "Source",
 | 
			
		||||
        "metadata": map[string]interface{}{
 | 
			
		||||
            "name":      "source-"+executionId,
 | 
			
		||||
            "namespace": executionId,
 | 
			
		||||
        },
 | 
			
		||||
        "spec": map[string]interface{}{
 | 
			
		||||
            "serviceAccountName": "sa-"+executionId,
 | 
			
		||||
        },
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	res, err := dynamicClientApply(executionId, "source",gvrSources, context, source)
 | 
			
		||||
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}}\"} }")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.New("Error when trying to apply Source definition :" + err.Error())
 | 
			
		||||
		fmt.Println("Error creating the template for the source Manifest")
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return res, nil
 | 
			
		||||
	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",
 | 
			
		||||
		[]byte(sourceManifest),
 | 
			
		||||
		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)
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return resp, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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 {
 | 
			
		||||
@@ -361,40 +339,35 @@ func (k *KubernetesService) CreateKubeconfigSecret(context context.Context,kubec
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	secretApplyConfig := apply.Secret("kube-secret-" + executionId,
 | 
			
		||||
									executionId).
 | 
			
		||||
								WithData(map[string][]byte{
 | 
			
		||||
										"config": config,
 | 
			
		||||
										},
 | 
			
		||||
									)
 | 
			
		||||
	secretManifest := &v1.Secret{
 | 
			
		||||
		ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
			Name:      "kube-secret-" + executionId,
 | 
			
		||||
			Namespace: executionId,
 | 
			
		||||
		},
 | 
			
		||||
		Data: map[string][]byte{
 | 
			
		||||
			"config": config,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	// exists, err := k.GetKubeconfigSecret(context,executionId)
 | 
			
		||||
	// if err != nil {
 | 
			
		||||
	// 	fmt.Println("Error verifying if kube secret exists in namespace ", executionId)
 | 
			
		||||
	// 	return nil, err
 | 
			
		||||
	// }
 | 
			
		||||
	// if exists != nil {
 | 
			
		||||
	// 	fmt.Println("kube-secret already exists in namespace", executionId)
 | 
			
		||||
	// 	fmt.Println("Overriding existing kube-secret with a newer resource")
 | 
			
		||||
	// 	// TODO : implement DeleteKubeConfigSecret(executionID)
 | 
			
		||||
	// 	deleted, err := k.DeleteKubeConfigSecret(executionId)
 | 
			
		||||
	// 	_ = deleted
 | 
			
		||||
	// 	_ = err
 | 
			
		||||
	// }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	resp, err := k.Set.CoreV1().
 | 
			
		||||
				Secrets(executionId).
 | 
			
		||||
				Apply(context,
 | 
			
		||||
					secretApplyConfig,
 | 
			
		||||
					metav1.ApplyOptions{
 | 
			
		||||
						FieldManager: "admiralty-manager",
 | 
			
		||||
				})
 | 
			
		||||
				
 | 
			
		||||
	exists, err := k.GetKubeconfigSecret(context, executionId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println("Error while trying to contact API to get secret kube-secret-"+executionId)
 | 
			
		||||
		fmt.Println("Error verifying if kube secret exists in namespace ", executionId)
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if exists != nil {
 | 
			
		||||
		fmt.Println("kube-secret already exists in namespace", executionId)
 | 
			
		||||
		fmt.Println("Overriding existing kube-secret with a newer resource")
 | 
			
		||||
		// TODO : implement DeleteKubeConfigSecret(executionID)
 | 
			
		||||
		deleted, err := k.DeleteKubeConfigSecret(executionId)
 | 
			
		||||
		_ = deleted
 | 
			
		||||
		_ = err
 | 
			
		||||
	}
 | 
			
		||||
	resp, err := k.Set.CoreV1().
 | 
			
		||||
		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(err)
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -406,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
 | 
			
		||||
	}
 | 
			
		||||
@@ -434,73 +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 dynamicClientApply(executionId string, typeResource string, resourceDefinition schema.GroupVersionResource, ctx context.Context, object map[string]interface{}) ([]byte, error) {
 | 
			
		||||
	cli, err := NewDynamicClient()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, errors.New("Could not retrieve dynamic client when creating Admiralty Source : " + err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	res, err := cli.Resource(resourceDefinition).
 | 
			
		||||
				Namespace(executionId).
 | 
			
		||||
				Apply(ctx, 
 | 
			
		||||
					typeResource + "-" + executionId,
 | 
			
		||||
					&unstructured.Unstructured{Object: object},
 | 
			
		||||
					metav1.ApplyOptions{
 | 
			
		||||
						FieldManager: "kubectl-client-side-apply", 
 | 
			
		||||
					},
 | 
			
		||||
				)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println("Error from k8s API when applying " + fmt.Sprint(object) + " to " + gvrSources.String() + " : " , err)
 | 
			
		||||
		return nil,err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	// We can add more info to the log with the content of resp if not nil
 | 
			
		||||
	resByte, err := json.Marshal(res) 
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		// fmt.Println("Error trying to create a Source on remote cluster : ", err , " : ", res)
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return resByte, nil
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func putCDRapiKube(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
 | 
			
		||||
@@ -509,13 +450,13 @@ func putCDRapiKube(client kubernetes.Clientset, ctx context.Context, path string
 | 
			
		||||
// 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)
 | 
			
		||||
@@ -523,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
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								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", ""))
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user