11package main
22
33import (
4- "encoding/json"
54 "errors"
65 "fmt"
76 "os"
8- "os/exec"
97 "path/filepath"
8+ "strings"
9+ "text/template"
1010
1111 "gofr.dev/pkg/gofr"
1212
13- "kops.dev/internal/models"
14- )
15-
16- const (
17- gcp = "GCP"
18- executableName = "main"
13+ "kops.dev/internal/templates"
1914)
2015
2116var (
22- errDepKeyNotProvided = errors .New ("KOPS_DEPLOYMENT_KEY not provided, please download the key form https://kops.dev" )
23- errCloudProviderNotRecognized = errors .New ("cloud provider in KOPS_DEPLOYMENT_KEY is not provided or supported" )
17+ errDepKeyNotProvided = errors .New ("KOPS_DEPLOYMENT_KEY not provided, " +
18+ "please download the key form https://kops.dev" )
19+ errLanguageNotProvided = errors .New ("unable to create DockerFile as project " +
20+ "programming language not provided. Please Provide a programming language using -lang=<language>" )
21+ errLanguageNotSupported = errors .New ("creating DockerFile for provided language is not supported yet" )
2422)
2523
2624func Deploy (ctx * gofr.Context ) (interface {}, error ) {
27- var deploy models.Deploy
28-
2925 keyFile := os .Getenv ("KOPS_DEPLOYMENT_KEY" )
3026 if keyFile == "" {
3127 return nil , errDepKeyNotProvided
3228 }
3329
34- f , err := os .ReadFile (filepath .Clean (keyFile ))
35- if err != nil {
36- return nil , err
37- }
38-
39- err = json .Unmarshal (f , & deploy )
40- if err != nil {
41- return nil , err
42- }
43-
44- // build binaries for the current working directory
45- err = buildBinary ()
30+ // letting this key file to be used later
31+ _ , err := os .ReadFile (filepath .Clean (keyFile ))
4632 if err != nil {
4733 return nil , err
4834 }
4935
50- // create and build docker image
51- err = createGoDockerFile ()
52- if err != nil {
53- return nil , err
54- }
55-
56- tag := ctx .Param ("tag" )
57- if tag == "" {
58- tag = "latest"
59- }
36+ fi , _ := os .Stat ("Dockerfile" )
37+ if fi != nil {
38+ fmt .Println ("Dockerfile present, using already created dockerfile" )
39+ } else {
40+ // removing the cloud-specific logic from cli to hosted service
41+ lang := ctx .Param ("lang" )
42+ if lang == "" {
43+ ctx .Logger .Errorf ("%v" , errLanguageNotProvided )
6044
61- image := filepath .Clean (deploy .ServiceName + ":" + tag )
45+ return nil , errLanguageNotProvided
46+ }
6247
63- err = replaceInputOutput ( exec . Command ( "docker" , "build" , "-t" , image , "." )). Run ( )
64- if err != nil {
65- return nil , err
66- }
48+ port := ctx . Param ( "p" )
49+ if port == "" {
50+ port = "8000"
51+ }
6752
68- // check what cloud provider is
69- switch deploy .CloudProvider {
70- case gcp :
71- err = deployGCP (& deploy , image )
72- if err != nil {
53+ if err := createDockerFile (ctx , lang , port ); err != nil {
7354 return nil , err
7455 }
75-
76- return "Successfully deployed!" , nil
77- default :
78- return nil , errCloudProviderNotRecognized
79- }
80- }
81-
82- func buildBinary () error {
83- fmt .Println ("Creating binary for the project" )
84-
85- output , err := exec .Command ("sh" , "-c" , "CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o " + executableName + " ." ).CombinedOutput ()
86- if err != nil {
87- fmt .Println ("error occurred while creating binary!" , output )
88-
89- return err
9056 }
9157
92- fmt .Println ("Binary created successfully" )
58+ // TODO: build and push the docker image to the Kops API
59+ // Also need to figure out the contract for the API
9360
94- return nil
61+ return "Successful" , nil
9562}
9663
97- func createGoDockerFile () error {
98- content := `FROM alpine:latest
99- RUN apk add --no-cache tzdata ca-certificates
100- COPY main ./main
101- RUN chmod +x /main
102- EXPOSE 8000
103- CMD ["/main"]`
64+ func createDockerFile (ctx * gofr.Context , lang , port string ) error {
65+ var content string
66+
67+ // get the template content for dockerFile based on the language
68+ switch strings .ToLower (lang ) {
69+ case "go" :
70+ content = templates .Golang
71+ case "java" :
72+ content = templates .Java
73+ case "js" :
74+ content = templates .Js
75+ default :
76+ ctx .Logger .Errorf ("creating DockerFile for %s is not supported yet," +
77+ " reach us at https://github.com/kops-dev/kops-cli/issues to know more" , lang )
10478
105- fi , _ := os .Stat ("Dockerfile" )
106- if fi != nil {
107- fmt .Println ("Dockerfile present, using already created dockerfile" )
108- return nil
79+ fmt .Printf ("creating DockerFile for %s is not supported yet, " +
80+ "reach us at https://github.com/kops-dev/kops-cli/issues to know more\n " , lang )
81+ fmt .Println ("you can create your own DockerFile and run the kops-cli again." )
82+
83+ return errLanguageNotSupported
10984 }
11085
11186 file , err := os .Create ("Dockerfile" )
@@ -115,11 +90,19 @@ CMD ["/main"]`
11590
11691 defer file .Close ()
11792
118- if _ , err = file .WriteString (content ); err != nil {
93+ t := template .New (lang )
94+
95+ temp , err := t .Parse (content )
96+ if err != nil {
11997 return err
12098 }
12199
122- fmt .Println ("Dockerfile created successfully!" )
100+ if er := temp .Execute (file , port ); er != nil {
101+ ctx .Logger .Error ("error while creating DockerFile" , er )
102+ fmt .Println ("unable to create the DockerFile, please check permissions for creating files in the directory" )
103+
104+ return er
105+ }
123106
124107 return nil
125108}
0 commit comments