Skip to content

Commit 613b299

Browse files
enhancement: added docker and k8s integration
1 parent 678b45b commit 613b299

File tree

5 files changed

+213
-15
lines changed

5 files changed

+213
-15
lines changed

internal/languages/dotnet/frameworks/dotnet-clean-architecture/copier.go

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ func NewCopier(gitPlatformURL, gitPlatformUserName, gitRepositoryName, nodeName,
146146
data := map[string]interface{}{
147147
"GitRepositoryName": gitRepositoryName,
148148
"NodeName": strings.ToLower(nodeName),
149+
"MicroServiceName": frameworks.GetMicroServiceName(nodeDirectoryName),
149150
"GitPlatformUserName": gitPlatformUserName,
150151
"GitPlatformURL": strings.Replace(gitPlatformURL, "https://", "", -1),
151152
}
@@ -196,11 +197,6 @@ func NewCopier(gitPlatformURL, gitPlatformUserName, gitRepositoryName, nodeName,
196197
}
197198
}
198199

199-
func getMicroServiceName(name string) string {
200-
splitted := strings.Split(name, "/")
201-
return splitted[len(splitted)-1]
202-
}
203-
204200
// createRestServerDirectories creates rest server directories.
205201
func (c *Copier) createRestServerDirectories() error {
206202
applicationDirectory := c.NodeDirectoryName + ApplicationPath
@@ -287,7 +283,7 @@ func (c *Copier) createRestServerDirectories() error {
287283
return err
288284
}
289285

290-
microServiceNameDirectory := c.NodeDirectoryName + "/" + getMicroServiceName(c.NodeDirectoryName)
286+
microServiceNameDirectory := c.NodeDirectoryName + "/" + frameworks.GetMicroServiceName(c.NodeDirectoryName)
291287
microServiceNameControllersDirectory := microServiceNameDirectory + MicroServiceNameControllersPath
292288
microServiceNamePropertiesDirectory := microServiceNameDirectory + MicroServiceNamePropertiesPath
293289
if err := utils.CreateDirectories(microServiceNameDirectory); err != nil {
@@ -579,7 +575,7 @@ func (c *Copier) addInfrastructureRelatedDirectoriesAndFiles(resource *corenode.
579575
func (c *Copier) addMicroServiceNameRelatedDirectoriesAndFiles(resource *corenode.Resource, filePaths *[]*string) error {
580576
var err error
581577
// copy MicroServiceName/Controllers/ResourceNameServiceController.cs
582-
targetMicroServiceNameControllersResourceNameServiceControllerFileName := c.NodeDirectoryName + "/" + getMicroServiceName(c.NodeDirectoryName) + MicroServiceNameControllersPath + "/" + resource.Name + "ServiceController.cs"
578+
targetMicroServiceNameControllersResourceNameServiceControllerFileName := c.NodeDirectoryName + "/" + frameworks.GetMicroServiceName(c.NodeDirectoryName) + MicroServiceNameControllersPath + "/" + resource.Name + "ServiceController.cs"
583579
_, err = utils.CopyFile(targetMicroServiceNameControllersResourceNameServiceControllerFileName, c.TemplatesRootPath+MicroServiceNameControllersResourceNameServiceControllerCSFile)
584580
if err != nil {
585581
log.Errorf("error copying MicroServiceName controllers resource name service controller file: %v", err)
@@ -588,7 +584,7 @@ func (c *Copier) addMicroServiceNameRelatedDirectoriesAndFiles(resource *corenod
588584
*filePaths = append(*filePaths, &targetMicroServiceNameControllersResourceNameServiceControllerFileName)
589585

590586
// copy MicroServiceName/Properties/launchSettings.json
591-
targetMicroServiceNamePropertiesLaunchSettingsJSONFileName := c.NodeDirectoryName + "/" + getMicroServiceName(c.NodeDirectoryName) + MicroServiceNamePropertiesPath + "/" + "launchSettings.json"
587+
targetMicroServiceNamePropertiesLaunchSettingsJSONFileName := c.NodeDirectoryName + "/" + frameworks.GetMicroServiceName(c.NodeDirectoryName) + MicroServiceNamePropertiesPath + "/" + "launchSettings.json"
592588
_, err = utils.CopyFile(targetMicroServiceNamePropertiesLaunchSettingsJSONFileName, c.TemplatesRootPath+MicroServiceNamePropertiesLaunchSettingsJSONFile)
593589
if err != nil {
594590
log.Errorf("error copying MicroServiceName properties launch settings json file: %v", err)
@@ -597,7 +593,7 @@ func (c *Copier) addMicroServiceNameRelatedDirectoriesAndFiles(resource *corenod
597593
*filePaths = append(*filePaths, &targetMicroServiceNamePropertiesLaunchSettingsJSONFileName)
598594

599595
// copy MicroServiceName/MicroServiceName.csproj
600-
targetMicroServiceNameCSProjFileName := c.NodeDirectoryName + "/" + getMicroServiceName(c.NodeDirectoryName) + "/" + getMicroServiceName(c.NodeDirectoryName) + ".csproj"
596+
targetMicroServiceNameCSProjFileName := c.NodeDirectoryName + "/" + frameworks.GetMicroServiceName(c.NodeDirectoryName) + "/" + frameworks.GetMicroServiceName(c.NodeDirectoryName) + ".csproj"
601597
_, err = utils.CopyFile(targetMicroServiceNameCSProjFileName, c.TemplatesRootPath+MicroServiceNameCSProjFile)
602598
if err != nil {
603599
log.Errorf("error copying MicroServiceName csproj file: %v", err)
@@ -606,7 +602,7 @@ func (c *Copier) addMicroServiceNameRelatedDirectoriesAndFiles(resource *corenod
606602
*filePaths = append(*filePaths, &targetMicroServiceNameCSProjFileName)
607603

608604
// copy MicroServiceName/MicroServiceName.csproj.user
609-
targetMicroServiceNameCSProjUserFileName := c.NodeDirectoryName + "/" + getMicroServiceName(c.NodeDirectoryName) + "/" + getMicroServiceName(c.NodeDirectoryName) + ".csproj.user"
605+
targetMicroServiceNameCSProjUserFileName := c.NodeDirectoryName + "/" + frameworks.GetMicroServiceName(c.NodeDirectoryName) + "/" + frameworks.GetMicroServiceName(c.NodeDirectoryName) + ".csproj.user"
610606
_, err = utils.CopyFile(targetMicroServiceNameCSProjUserFileName, c.TemplatesRootPath+MicroServiceNameCSProjUserFile)
611607
if err != nil {
612608
log.Errorf("error copying MicroServiceName csproj.user file: %v", err)
@@ -615,7 +611,7 @@ func (c *Copier) addMicroServiceNameRelatedDirectoriesAndFiles(resource *corenod
615611
*filePaths = append(*filePaths, &targetMicroServiceNameCSProjUserFileName)
616612

617613
// copy MicroServiceName/Program.cs
618-
targetMicroServiceNameProgramCSFileName := c.NodeDirectoryName + "/" + getMicroServiceName(c.NodeDirectoryName) + "/" + "Program.cs"
614+
targetMicroServiceNameProgramCSFileName := c.NodeDirectoryName + "/" + frameworks.GetMicroServiceName(c.NodeDirectoryName) + "/" + "Program.cs"
619615
_, err = utils.CopyFile(targetMicroServiceNameProgramCSFileName, c.TemplatesRootPath+MicroServiceNameProgramCSFile)
620616
if err != nil {
621617
log.Errorf("error copying MicroServiceName program cs file: %v", err)
@@ -624,7 +620,7 @@ func (c *Copier) addMicroServiceNameRelatedDirectoriesAndFiles(resource *corenod
624620
*filePaths = append(*filePaths, &targetMicroServiceNameProgramCSFileName)
625621

626622
// copy MicroServiceName/appsettings.Development.json
627-
targetMicroServiceNameAppSettingsDevelopmentFileName := c.NodeDirectoryName + "/" + getMicroServiceName(c.NodeDirectoryName) + "/" + "appsettings.Development.json"
623+
targetMicroServiceNameAppSettingsDevelopmentFileName := c.NodeDirectoryName + "/" + frameworks.GetMicroServiceName(c.NodeDirectoryName) + "/" + "appsettings.Development.json"
628624
_, err = utils.CopyFile(targetMicroServiceNameAppSettingsDevelopmentFileName, c.TemplatesRootPath+MicroServiceNameAppSettingsDevelopmentFile)
629625
if err != nil {
630626
log.Errorf("error copying MicroServiceName appsettings.Development.json file: %v", err)
@@ -633,7 +629,7 @@ func (c *Copier) addMicroServiceNameRelatedDirectoriesAndFiles(resource *corenod
633629
*filePaths = append(*filePaths, &targetMicroServiceNameAppSettingsDevelopmentFileName)
634630

635631
// copy MicroServiceName/appsettings.json
636-
targetMicroServiceNameAppSettingsFileName := c.NodeDirectoryName + "/" + getMicroServiceName(c.NodeDirectoryName) + "/" + "appsettings.json"
632+
targetMicroServiceNameAppSettingsFileName := c.NodeDirectoryName + "/" + frameworks.GetMicroServiceName(c.NodeDirectoryName) + "/" + "appsettings.json"
637633
_, err = utils.CopyFile(targetMicroServiceNameAppSettingsFileName, c.TemplatesRootPath+MicroServiceNameAppSettingsFile)
638634
if err != nil {
639635
log.Errorf("error copying MicroServiceName appsettings.json file: %v", err)
@@ -861,7 +857,7 @@ func (c *Copier) copyTestsFiles() error {
861857

862858
func (c *Copier) copyMicroServiceNameSlnFile() error {
863859
filePaths := &[]*string{}
864-
targetMicroServiceNameSLNFileName := c.NodeDirectoryName + "/" + getMicroServiceName(c.NodeDirectoryName) + ".sln"
860+
targetMicroServiceNameSLNFileName := c.NodeDirectoryName + "/" + frameworks.GetMicroServiceName(c.NodeDirectoryName) + ".sln"
865861
_, err := utils.CopyFile(targetMicroServiceNameSLNFileName, c.TemplatesRootPath+MicroServiceNameSlnFile)
866862
if err != nil {
867863
log.Errorf("error copying MicroServiceName.sln file: %v", err)

internal/languages/dotnet/frameworks/utils.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package frameworks
22

3+
import "strings"
4+
35
type RestResourceData struct {
46
SmallKebabCaseResourceNameSingular string
57
SmallSnakeCaseResourceNameSingular string
@@ -47,3 +49,8 @@ func AddRESTAllowedMethods(restResourceData *RestResourceData, restAllowedMethod
4749
}
4850
}
4951
}
52+
53+
func GetMicroServiceName(name string) string {
54+
splitted := strings.Split(name, "/")
55+
return splitted[len(splitted)-1]
56+
}

internal/languages/dotnet/generator.go

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
corenode "github.com/intelops/compage/internal/core/node"
99
"github.com/intelops/compage/internal/languages"
1010
"github.com/intelops/compage/internal/languages/dotnet/frameworks/dotnet-clean-architecture"
11+
"github.com/intelops/compage/internal/languages/dotnet/integrations/docker"
12+
"github.com/intelops/compage/internal/languages/dotnet/integrations/kubernetes"
1113
"github.com/intelops/compage/internal/languages/templates"
1214
log "github.com/sirupsen/logrus"
1315
"strings"
@@ -24,6 +26,13 @@ func Generate(ctx context.Context) error {
2426
return err
2527
}
2628

29+
// integrations config
30+
err = generateIntegrationConfig(&goValues)
31+
if err != nil {
32+
log.Errorf("err : %s", err)
33+
return err
34+
}
35+
2736
return nil
2837
}
2938

@@ -63,8 +72,8 @@ func getDotNetCleanArchitectureCopier(dotNetValues *DotNetValues) (*dotnetcleana
6372
gitPlatformURL := dotNetValues.Values.Get(languages.GitPlatformURL)
6473
gitPlatformUserName := dotNetValues.Values.Get(languages.GitPlatformUserName)
6574
gitRepositoryName := dotNetValues.Values.Get(languages.GitRepositoryName)
66-
nodeName := dotNetValues.Values.Get(languages.NodeName)
6775
// dotnet nodes usually have a directory name same as node name itself but in caps.
76+
nodeName := dotNetValues.Values.Get(languages.NodeName)
6877
nodeDirectoryName := strings.Replace(dotNetValues.Values.NodeDirectoryName, nodeName, strcase.ToCamel(nodeName), 1)
6978
isRestServer := dotNetValues.LDotNetLangNode.RestConfig != nil && dotNetValues.LDotNetLangNode.RestConfig.Server != nil
7079
var restServerPort string
@@ -95,3 +104,58 @@ func getDotNetCleanArchitectureCopier(dotNetValues *DotNetValues) (*dotnetcleana
95104

96105
return copier, nil
97106
}
107+
108+
func generateIntegrationConfig(dotNetValues *DotNetValues) error {
109+
m, err := getIntegrationsCopier(dotNetValues)
110+
if err != nil {
111+
log.Errorf("error while getting the integrations copier [" + err.Error() + "]")
112+
return err
113+
}
114+
// dockerfile needs to be generated for the whole project, so it should be here.
115+
dockerCopier := m["docker"].(*docker.Copier)
116+
if err = dockerCopier.CreateDockerFile(); err != nil {
117+
log.Errorf("err : %s", err)
118+
return err
119+
}
120+
121+
// k8s files need to be generated for the whole project, so it should be here.
122+
k8sCopier := m["k8s"].(*kubernetes.Copier)
123+
if err = k8sCopier.CreateKubernetesFiles(); err != nil {
124+
log.Errorf("err : %s", err)
125+
return err
126+
}
127+
128+
return nil
129+
}
130+
131+
func getIntegrationsCopier(dotNetValues *DotNetValues) (map[string]interface{}, error) {
132+
dotNetTemplatesRootPath := GetDotNetTemplatesRootPath()
133+
if dotNetTemplatesRootPath == "" {
134+
return nil, errors.New("dotnet templates root path is empty")
135+
}
136+
137+
gitPlatformUserName := dotNetValues.Values.Get(languages.GitPlatformUserName)
138+
gitRepositoryName := dotNetValues.Values.Get(languages.GitRepositoryName)
139+
nodeName := dotNetValues.Values.Get(languages.NodeName)
140+
// dotnet nodes usually have a directory name same as node name itself but in caps.
141+
nodeDirectoryName := strings.Replace(dotNetValues.Values.NodeDirectoryName, nodeName, strcase.ToCamel(nodeName), 1)
142+
// rest
143+
isRestServer := dotNetValues.LDotNetLangNode.RestConfig != nil && dotNetValues.LDotNetLangNode.RestConfig.Server != nil
144+
var restServerPort string
145+
if isRestServer {
146+
restServerPort = dotNetValues.LDotNetLangNode.RestConfig.Server.Port
147+
} else {
148+
restServerPort = ""
149+
}
150+
151+
// create dotnet specific dockerCopier
152+
dockerCopier := docker.NewCopier(gitPlatformUserName, gitRepositoryName, nodeName, nodeDirectoryName, dotNetTemplatesRootPath, isRestServer, restServerPort)
153+
154+
// create dotnet specific k8sCopier
155+
k8sCopier := kubernetes.NewCopier(gitPlatformUserName, gitRepositoryName, nodeName, nodeDirectoryName, dotNetTemplatesRootPath, isRestServer, restServerPort)
156+
157+
return map[string]interface{}{
158+
"docker": dockerCopier,
159+
"k8s": k8sCopier,
160+
}, nil
161+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package docker
2+
3+
import (
4+
"github.com/intelops/compage/internal/languages/dotnet/frameworks"
5+
"github.com/intelops/compage/internal/languages/executor"
6+
"github.com/intelops/compage/internal/utils"
7+
log "github.com/sirupsen/logrus"
8+
"strings"
9+
)
10+
11+
const File = "Dockerfile.tmpl"
12+
13+
// Copier integrations specific copier
14+
type Copier struct {
15+
NodeDirectoryName string
16+
TemplatesRootPath string
17+
Data map[string]interface{}
18+
IsRestServer bool
19+
RestServerPort string
20+
}
21+
22+
func NewCopier(gitPlatformUserName, gitRepositoryName, nodeName, nodeDirectoryName, templatesRootPath string, isRestServer bool, restServerPort string) *Copier {
23+
// populate map to replace templates
24+
data := map[string]interface{}{
25+
"GitRepositoryName": gitRepositoryName,
26+
"NodeName": strings.ToLower(nodeName),
27+
"MicroServiceName": frameworks.GetMicroServiceName(nodeDirectoryName),
28+
"GitPlatformUserName": gitPlatformUserName,
29+
}
30+
31+
if isRestServer {
32+
data["RestServerPort"] = restServerPort
33+
}
34+
data["IsRestServer"] = isRestServer
35+
36+
return &Copier{
37+
TemplatesRootPath: templatesRootPath,
38+
NodeDirectoryName: nodeDirectoryName,
39+
IsRestServer: isRestServer,
40+
RestServerPort: restServerPort,
41+
Data: data,
42+
}
43+
}
44+
45+
// CreateDockerFile creates the required file from language template.
46+
func (c Copier) CreateDockerFile() error {
47+
var filePaths []*string
48+
// copy dockerfile
49+
targetDockerFileName := c.NodeDirectoryName + "/" + File
50+
_, err := utils.CopyFile(targetDockerFileName, c.TemplatesRootPath+"/"+File)
51+
if err != nil {
52+
log.Errorf("error while copying dockerfile [" + err.Error() + "]")
53+
return err
54+
}
55+
filePaths = append(filePaths, &targetDockerFileName)
56+
return executor.Execute(filePaths, c.Data)
57+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package kubernetes
2+
3+
import (
4+
"github.com/intelops/compage/internal/languages/dotnet/frameworks"
5+
"github.com/intelops/compage/internal/languages/executor"
6+
"github.com/intelops/compage/internal/utils"
7+
log "github.com/sirupsen/logrus"
8+
"strings"
9+
)
10+
11+
const Path = "/kubernetes"
12+
const DeploymentFile = "deployment.yaml.tmpl"
13+
const ServiceFile = "service.yaml.tmpl"
14+
15+
// Copier integrations specific copier
16+
type Copier struct {
17+
NodeDirectoryName string
18+
TemplatesRootPath string
19+
Data map[string]interface{}
20+
IsRestServer bool
21+
RestServerPort string
22+
}
23+
24+
func NewCopier(gitPlatformUserName, gitRepositoryName, nodeName, nodeDirectoryName, templatesRootPath string, isRestServer bool, restServerPort string) *Copier {
25+
// populate map to replace templates
26+
data := map[string]interface{}{
27+
"GitRepositoryName": gitRepositoryName,
28+
"NodeName": strings.ToLower(nodeName),
29+
"MicroServiceName": frameworks.GetMicroServiceName(nodeDirectoryName),
30+
"GitPlatformUserName": gitPlatformUserName,
31+
}
32+
33+
if isRestServer {
34+
data["RestServerPort"] = restServerPort
35+
}
36+
data["IsRestServer"] = isRestServer
37+
38+
return &Copier{
39+
TemplatesRootPath: templatesRootPath,
40+
NodeDirectoryName: nodeDirectoryName,
41+
IsRestServer: isRestServer,
42+
RestServerPort: restServerPort,
43+
Data: data,
44+
}
45+
}
46+
47+
// CreateKubernetesFiles creates required directory and copies files from language template.
48+
func (c Copier) CreateKubernetesFiles() error {
49+
destKubernetesDirectory := c.NodeDirectoryName + Path
50+
if err := utils.CreateDirectories(destKubernetesDirectory); err != nil {
51+
log.Errorf("error creating directory %s", destKubernetesDirectory)
52+
return err
53+
}
54+
var filePaths []*string
55+
if c.IsRestServer {
56+
// copy service files to the generated kubernetes manifests
57+
targetKubernetesServiceFileName := c.NodeDirectoryName + Path + "/" + ServiceFile
58+
_, err := utils.CopyFile(targetKubernetesServiceFileName, c.TemplatesRootPath+Path+"/"+ServiceFile)
59+
if err != nil {
60+
log.Errorf("error copying file %s", targetKubernetesServiceFileName)
61+
return err
62+
}
63+
filePaths = append(filePaths, &targetKubernetesServiceFileName)
64+
}
65+
// copy deployment files to the generated kubernetes manifests
66+
targetKubernetesDeploymentFileName := c.NodeDirectoryName + Path + "/" + DeploymentFile
67+
_, err := utils.CopyFile(targetKubernetesDeploymentFileName, c.TemplatesRootPath+Path+"/"+DeploymentFile)
68+
if err != nil {
69+
log.Errorf("error copying file %s", targetKubernetesDeploymentFileName)
70+
return err
71+
}
72+
filePaths = append(filePaths, &targetKubernetesDeploymentFileName)
73+
return executor.Execute(filePaths, c.Data)
74+
}

0 commit comments

Comments
 (0)