1
1
package main
2
2
3
3
import (
4
- "encoding/json"
5
4
"errors"
6
5
"fmt"
7
6
"os"
8
- "os/exec"
9
7
"path/filepath"
8
+ "strings"
9
+ "text/template"
10
10
11
11
"gofr.dev/pkg/gofr"
12
12
13
- "kops.dev/internal/models"
14
- )
15
-
16
- const (
17
- gcp = "GCP"
18
- executableName = "main"
13
+ "kops.dev/internal/templates"
19
14
)
20
15
21
16
var (
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" )
24
22
)
25
23
26
24
func Deploy (ctx * gofr.Context ) (interface {}, error ) {
27
- var deploy models.Deploy
28
-
29
25
keyFile := os .Getenv ("KOPS_DEPLOYMENT_KEY" )
30
26
if keyFile == "" {
31
27
return nil , errDepKeyNotProvided
32
28
}
33
29
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 ))
46
32
if err != nil {
47
33
return nil , err
48
34
}
49
35
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 )
60
44
61
- image := filepath .Clean (deploy .ServiceName + ":" + tag )
45
+ return nil , errLanguageNotProvided
46
+ }
62
47
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
+ }
67
52
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 {
73
54
return nil , err
74
55
}
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
90
56
}
91
57
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
93
60
94
- return nil
61
+ return "Successful" , nil
95
62
}
96
63
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 )
104
78
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
109
84
}
110
85
111
86
file , err := os .Create ("Dockerfile" )
@@ -115,11 +90,19 @@ CMD ["/main"]`
115
90
116
91
defer file .Close ()
117
92
118
- if _ , err = file .WriteString (content ); err != nil {
93
+ t := template .New (lang )
94
+
95
+ temp , err := t .Parse (content )
96
+ if err != nil {
119
97
return err
120
98
}
121
99
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
+ }
123
106
124
107
return nil
125
108
}
0 commit comments