This repository has been archived by the owner on Jun 3, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
generate.go
103 lines (96 loc) · 3.13 KB
/
generate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package application
import (
"fmt"
"io/ioutil"
"path"
"github.com/Originate/exosphere/src/application/deployer"
"github.com/Originate/exosphere/src/docker/composebuilder"
"github.com/Originate/exosphere/src/terraform"
"github.com/Originate/exosphere/src/types"
"github.com/Originate/exosphere/src/types/context"
"github.com/Originate/exosphere/src/types/deploy"
"github.com/Originate/exosphere/src/util"
yaml "gopkg.in/yaml.v2"
)
var buildModes = []types.BuildMode{
types.BuildMode{
Type: types.BuildModeTypeLocal,
Environment: types.BuildModeEnvironmentTest,
},
types.BuildMode{
Type: types.BuildModeTypeLocal,
Mount: true,
Environment: types.BuildModeEnvironmentDevelopment,
},
types.BuildMode{
Type: types.BuildModeTypeLocal,
Environment: types.BuildModeEnvironmentProduction,
},
}
// CheckGeneratedDockerComposeFiles checks if docker-compose files are up-to-date
func CheckGeneratedDockerComposeFiles(appContext *context.AppContext) error {
for _, buildMode := range buildModes {
dockerCompose, err := composebuilder.GetApplicationDockerCompose(composebuilder.ApplicationOptions{
AppContext: appContext,
BuildMode: buildMode,
})
if err != nil {
return err
}
err = diffDockerCompose(dockerCompose, appContext.Location, buildMode.GetDockerComposeFileName())
if err != nil {
return err
}
}
return nil
}
// GenerateComposeFiles generates all docker-compose files for exosphere commands
func GenerateComposeFiles(appContext *context.AppContext) error {
composeDir := path.Join(appContext.Location, "docker-compose")
for _, buildMode := range buildModes {
dockerCompose, err := composebuilder.GetApplicationDockerCompose(composebuilder.ApplicationOptions{
AppContext: appContext,
BuildMode: buildMode,
})
if err != nil {
return err
}
err = composebuilder.WriteYML(composeDir, buildMode.GetDockerComposeFileName(), dockerCompose)
if err != nil {
return err
}
}
return nil
}
// GenerateTerraformFiles validates application configuration and generates the terraform file
func GenerateTerraformFiles(deployConfig deploy.Config) error {
err := deployer.ValidateConfigs(deployConfig)
if err != nil {
return err
}
return terraform.GenerateFiles(deployConfig)
}
func diffDockerCompose(newDockerCompose *types.DockerCompose, appDir, dockerComposeFileName string) error {
dockerComposeRelativeFilePath := path.Join("docker-compose", dockerComposeFileName)
dockerComposeAbsoluteFilePath := path.Join(appDir, dockerComposeRelativeFilePath)
fileExists, err := util.DoesFileExist(dockerComposeAbsoluteFilePath)
if err != nil {
return err
}
if fileExists {
currDockerComposeContent, err := ioutil.ReadFile(dockerComposeAbsoluteFilePath)
if err != nil {
return err
}
newDockerComposeContent, err := yaml.Marshal(newDockerCompose)
if err != nil {
return err
}
if string(currDockerComposeContent) != string(newDockerComposeContent) {
return fmt.Errorf("'%s' is out of date. Please run 'exo generate'", dockerComposeRelativeFilePath)
}
} else {
return fmt.Errorf("'%s' does not exist. Please run 'exo generate'", dockerComposeRelativeFilePath)
}
return nil
}