From 37de81a835df5098af72d9c4017fdfe891dce8b8 Mon Sep 17 00:00:00 2001 From: Christopher Hase Date: Wed, 3 Sep 2025 15:36:49 +0200 Subject: [PATCH] feat(client): created provider instance --- go.mod | 22 ++++++- go.sum | 73 ++++++++++++++++++++++ internal/client/models.go | 4 +- internal/spec/spec.go | 120 ++++++++++++++++++++++++++++++++++++ lala/lala.go | 6 +- provider/provider.go | 126 +++++++++++++++++++++++++++++++++++--- 6 files changed, 340 insertions(+), 11 deletions(-) create mode 100644 internal/spec/spec.go diff --git a/go.mod b/go.mod index e7a4557..82a9751 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module edp.buildth.ing/DevFW-CICD/garm-provider-edge-connect -go 1.24 +go 1.24.0 + +toolchain go1.24.2 require ( github.com/BurntSushi/toml v1.5.0 @@ -8,8 +10,26 @@ require ( ) require ( + github.com/fxamacker/cbor/v2 v2.9.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/stretchr/testify v1.10.0 // indirect + github.com/x448/float16 v0.8.4 // indirect + go.yaml.in/yaml/v2 v2.4.2 // indirect + golang.org/x/net v0.41.0 // indirect golang.org/x/sys v0.34.0 // indirect + golang.org/x/text v0.26.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + k8s.io/api v0.34.0 // indirect + k8s.io/apimachinery v0.34.0 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect + sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect ) diff --git a/go.sum b/go.sum index 6bbe00c..4b9db5c 100644 --- a/go.sum +++ b/go.sum @@ -2,16 +2,89 @@ github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/cloudbase/garm-provider-common v0.1.7 h1:V0upTejFRDiyFBO4hhkMWmPtmRTguyOt/4i1u9/rfbg= github.com/cloudbase/garm-provider-common v0.1.7/go.mod h1:2O51WbcfqRx5fDHyyJgIFq7KdTZZnefsM+aoOchyleU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= +go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= +golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.34.0 h1:L+JtP2wDbEYPUeNGbeSa/5GwFtIA662EmT2YSLOkAVE= +k8s.io/api v0.34.0/go.mod h1:YzgkIzOOlhl9uwWCZNqpw6RJy9L2FK4dlJeayUoydug= +k8s.io/apimachinery v0.34.0 h1:eR1WO5fo0HyoQZt1wdISpFDffnWOvFLOOeJ7MgIv4z0= +k8s.io/apimachinery v0.34.0/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= +k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= +sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= diff --git a/internal/client/models.go b/internal/client/models.go index 3a91b96..7fdf999 100644 --- a/internal/client/models.go +++ b/internal/client/models.go @@ -9,8 +9,8 @@ type AppInstance struct { Key AppInstanceKey `json:"key"` AppKey AppKey `json:"app_key"` Flavor Flavor `json:"flavor"` - State string `json:"state"` - PowerState string `json:"power_state"` + State string `json:"state,omitempty"` + PowerState string `json:"power_state,omitempty"` } type AppInstanceKey struct { diff --git a/internal/spec/spec.go b/internal/spec/spec.go new file mode 100644 index 0000000..c42a389 --- /dev/null +++ b/internal/spec/spec.go @@ -0,0 +1,120 @@ +package spec + +import ( + "fmt" + "net/url" + "strings" + + "github.com/cloudbase/garm-provider-common/params" + corev1 "k8s.io/api/core/v1" +) + +type GitHubScopeDetails struct { + BaseURL string + Repo string + Org string + Enterprise string +} + +func ExtractGitHubScopeDetails(gitRepoURL string) (GitHubScopeDetails, error) { + if gitRepoURL == "" { + return GitHubScopeDetails{}, fmt.Errorf("no gitRepoURL supplied") + } + u, err := url.Parse(gitRepoURL) + if err != nil { + return GitHubScopeDetails{}, fmt.Errorf("invalid URL: %w", err) + } + + if u.Scheme == "" || u.Host == "" { + return GitHubScopeDetails{}, fmt.Errorf("invalid URL: %s", gitRepoURL) + } + + pathParts := strings.Split(strings.Trim(u.Path, "/"), "/") + + scope := GitHubScopeDetails{ + BaseURL: u.Scheme + "://" + u.Host, + } + + switch { + case len(pathParts) == 1: + scope.Org = pathParts[0] + case len(pathParts) == 2 && pathParts[0] == "enterprises": + scope.Enterprise = pathParts[1] + case len(pathParts) == 2: + scope.Org = pathParts[0] + scope.Repo = pathParts[1] + default: + return GitHubScopeDetails{}, fmt.Errorf("URL does not match the expected patterns") + } + + return scope, nil +} + +func GetRunnerEnvs(gitHubScope GitHubScopeDetails, bootstrapParams params.BootstrapInstance) []corev1.EnvVar { + return []corev1.EnvVar{ + { + Name: "RUNNER_ORG", + Value: gitHubScope.Org, + }, + { + Name: "RUNNER_REPO", + Value: gitHubScope.Repo, + }, + { + Name: "RUNNER_ENTERPRISE", + Value: gitHubScope.Enterprise, + }, + { + Name: "RUNNER_GROUP", + Value: bootstrapParams.GitHubRunnerGroup, + }, + { + Name: "RUNNER_NAME", + Value: bootstrapParams.Name, + }, + { + Name: "RUNNER_LABELS", + Value: strings.Join(bootstrapParams.Labels, ","), + }, + { + Name: "RUNNER_NO_DEFAULT_LABELS", + Value: "true", + }, + { + Name: "DISABLE_RUNNER_UPDATE", + Value: "true", + }, + { + Name: "RUNNER_WORKDIR", + Value: "/runner/_work/", + }, + { + Name: "GITHUB_URL", + Value: gitHubScope.BaseURL, + }, + { + Name: "RUNNER_EPHEMERAL", + Value: "true", + }, + { + Name: "RUNNER_TOKEN", + Value: "dummy", + }, + { + Name: "METADATA_URL", + Value: bootstrapParams.MetadataURL, + }, + { + Name: "BEARER_TOKEN", + Value: bootstrapParams.InstanceToken, + }, + { + Name: "CALLBACK_URL", + Value: bootstrapParams.CallbackURL, + }, + { + Name: "JIT_CONFIG_ENABLED", + Value: fmt.Sprintf("%t", bootstrapParams.JitConfigEnabled), + }, + } +} diff --git a/lala/lala.go b/lala/lala.go index afd4237..7d1db5e 100644 --- a/lala/lala.go +++ b/lala/lala.go @@ -8,6 +8,7 @@ import ( "edp.buildth.ing/DevFW-CICD/garm-provider-edge-connect/internal/client" "edp.buildth.ing/DevFW-CICD/garm-provider-edge-connect/provider" + "github.com/cloudbase/garm-provider-common/params" ) var testManifest = ` @@ -147,7 +148,10 @@ func main() { fmt.Printf("Error: %v\n", err) edgeprovider, err := provider.NewEdgeConnectProvider("/home/chris/ipcei/projects/garm-provider-edge-connect/config/config.toml", "lalacontroller") - providerinst, err := edgeprovider.GetInstance(ctx, appinst.Key.Name) + //providerinst, err := edgeprovider.GetInstance(ctx, appinst.Key.Name) + providerinst, err := edgeprovider.CreateInstance(ctx, params.BootstrapInstance{ + Name: "bootstrapparams", + }) fmt.Printf("provider: %v\n", providerinst) fmt.Printf("Error: %v\n", err) diff --git a/provider/provider.go b/provider/provider.go index 1058be9..428340d 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -16,6 +16,7 @@ package provider import ( "context" + "encoding/json" "fmt" "net/http" "os" @@ -23,6 +24,10 @@ import ( "edp.buildth.ing/DevFW-CICD/garm-provider-edge-connect/config" "edp.buildth.ing/DevFW-CICD/garm-provider-edge-connect/internal/client" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" + execution "github.com/cloudbase/garm-provider-common/execution/v0.1.0" "github.com/cloudbase/garm-provider-common/params" ) @@ -59,14 +64,121 @@ type edgeConnectProvider struct { // CreateInstance creates a new compute instance in the provider. func (a *edgeConnectProvider) CreateInstance(ctx context.Context, bootstrapParams params.BootstrapInstance) (params.ProviderInstance, error) { + podv1 := corev1.Pod{ + TypeMeta: metav1.TypeMeta{ + Kind: "Pod", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: bootstrapParams.Name, + Labels: map[string]string{"run": bootstrapParams.Name}, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + corev1.Container{ + Name: "mganter-test", + Image: "edp.buildth.ing/devfw-cicd/nginx", + ImagePullPolicy: "Always", + Ports: []corev1.ContainerPort{ + corev1.ContainerPort{ + Name: "HTTP", + ContainerPort: 80, + Protocol: "TCP", + }, + }, + }, + }, + }, + } + + service := corev1.Service{ + TypeMeta: metav1.TypeMeta{ + Kind: "Service", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: bootstrapParams.Name, + }, + Spec: corev1.ServiceSpec{ + Type: corev1.ServiceTypeLoadBalancer, + Ports: []corev1.ServicePort{ + corev1.ServicePort{ + Name: "tcp80", + Protocol: "TCP", + Port: 80, + TargetPort: intstr.FromInt(80), + }, + }, + Selector: map[string]string{"run": bootstrapParams.Name}, + }, + } + + podjson, err := json.Marshal(podv1) + if err != nil { + return params.ProviderInstance{}, err + } + + servicejson, err := json.Marshal(service) + if err != nil { + return params.ProviderInstance{}, err + } + + manifest := fmt.Sprintf("%s\n---\n%s", string(podjson), string(servicejson)) + + err = a.client.NewApp(ctx, client.NewAppInput{ + Region: a.cfg.Region, + App: client.App{ + Key: client.AppKey{ + Organization: a.cfg.Organization, + Name: bootstrapParams.Name, + Version: "0.0.1", + }, + Deployment: "kubernetes", + ImageType: "Docker", + ImagePath: "edp.buildth.ing/devfw-cicd/nginx", + AllowServerless: true, + ServerlessConfig: struct{}{}, + DefaultFlavor: client.Flavor{ + Name: "EU.small", + }, + DeploymentGenerator: "kubernetes-basic", + DeploymentManifest: manifest, + }, + }) + if err != nil { + return params.ProviderInstance{}, err + } + + err = a.client.NewAppInstance(ctx, client.NewAppInstanceInput{ + Region: a.cfg.Region, + AppInst: client.AppInstance{ + Key: client.AppInstanceKey{ + Organization: a.cfg.Organization, + Name: bootstrapParams.Name, + CloudletKey: client.CloudletKey(a.cfg.CloudletKey), + }, + AppKey: client.AppKey{ + Organization: a.cfg.Organization, + Name: bootstrapParams.Name, + Version: "0.0.1", + }, + Flavor: client.Flavor{ + Name: "EU.small", + }, + }, + }) + if err != nil { + return params.ProviderInstance{}, err + } + instance := params.ProviderInstance{ - ProviderID: "", - Name: "", - OSType: "", - OSArch: "", - OSName: "", - OSVersion: "", - Status: "running", + ProviderID: a.controllerID, + Name: bootstrapParams.Name, + OSType: params.Linux, + OSArch: params.Amd64, + OSName: "lala", + OSVersion: "lalatest", + Status: params.InstanceCreating, } return instance, nil