diff --git a/README.md b/README.md index dd0a00c..9f7bab9 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,8 @@ gbatect take the `docker-compose.yml` and translates it to `batect.yml`. - [x] Convert docker-compose.yml to batect.yml - [x] Support all batect field types - [x] basic output batect -- [ ] basic cli - - [ ] basic help document +- [x] basic cli + - [x] basic help document - [x] project quality flow - [x] coverage test - [x] code style check diff --git a/cmd/cmd.go b/cmd/cmd.go index 93ec6d8..cb7867b 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -1,13 +1,8 @@ package cmd import ( - "fmt" "github.com/bidaya0/gbatect/converter" - batecttypes "github.com/bidaya0/gbatect/types" - "github.com/compose-spec/compose-go/loader" "github.com/spf13/cobra" - "gopkg.in/yaml.v3" - "os" ) var rootCmd = &cobra.Command{ @@ -23,45 +18,10 @@ var tofile string var convertCmd = &cobra.Command{ Use: "convert", - Short: "A batect file convertor", - Long: `gbatect is a tool help users move exists docker-compose to batect. - gbatect take the docker-compose.yml and translates it to batect.yml. -`, + Short: "convert docker-compose file to batect format", + Long: `take the docker-compose.yml and translates it to batect.yml.`, Run: func(cmd *cobra.Command, args []string) { - - if fromfile != "" { - dockercomposefile, err := os.ReadFile(fromfile) - if err != nil { - fmt.Printf("error: %v", err) - } - k1, err := loader.ParseYAML(dockercomposefile) - if err != nil { - fmt.Printf("error: %v", err) - } - tmpk := k1["services"] - tmp3, _ := tmpk.(map[string]interface{}) - services, err := converter.LoadServices(tmp3) - containers, err := converter.TransServicesToContainer(services) - var f1 = batecttypes.BatectConfig{ - Containers: containers, - } - batectyaml, err := yaml.Marshal(&f1) - if err != nil { - fmt.Printf("error: %v", err) - } - - if err != nil { - fmt.Printf("error: %v", err) - } - if tofile != "" { - err := os.WriteFile(tofile, batectyaml, 0644) - if err != nil { - fmt.Printf("%v", err) - } - } else { - fmt.Printf("%v", string(batectyaml)) - } - } + converter.ConvertFiletoFile(fromfile, tofile) }, } @@ -69,7 +29,7 @@ var convertCmd = &cobra.Command{ func Execute() error { rootCmd.AddCommand(convertCmd) convertCmd.Flags().StringVarP(&fromfile, "fromfile", "f", "", "Source directory to read from") - convertCmd.Flags().StringVarP(&tofile, "tofile", "t", "", "Target directory to output") + convertCmd.Flags().StringVarP(&tofile, "tofile", "t", "/dev/stdout", "Target directory to output") return rootCmd.Execute() } diff --git a/converter/converter.go b/converter/converter.go index db514ea..9ccf86f 100644 --- a/converter/converter.go +++ b/converter/converter.go @@ -10,6 +10,9 @@ import ( "strings" ) +/* +Use to load the services part of docker-compose.yml. +*/ func LoadServices(servicesDict map[string]interface{}) ([]composetypes.ServiceConfig, error) { var services []composetypes.ServiceConfig for name, element := range servicesDict { @@ -23,6 +26,9 @@ func LoadServices(servicesDict map[string]interface{}) ([]composetypes.ServiceCo return services, nil } +/* +Use to convert service defined by compose-go to batecttypes.Containers. +*/ func TransServicesToContainer(servicesconfigs []composetypes.ServiceConfig) (batecttypes.Containers, error) { containers := make(map[string]batecttypes.ContainerOption) for _, service := range servicesconfigs { @@ -84,26 +90,33 @@ func TransServicesToContainer(servicesconfigs []composetypes.ServiceConfig) (bat return containers, nil } -func ReadAndConvert(sourceFilePath string) ([]byte, error) { - dockercomposefile, err := os.ReadFile(sourceFilePath) - if err != nil { - fmt.Printf("error: %v", err) - return nil, err - } - k1, err := loader.ParseYAML(dockercomposefile) - if err != nil { - return nil, err - } - tmpk := k1["services"] - tmp3, _ := tmpk.(map[string]interface{}) - services, err := LoadServices(tmp3) - containers, err := TransServicesToContainer(services) - var f1 = batecttypes.BatectConfig{ - Containers: containers, - } - batectyaml, err := yaml.Marshal(&f1) - if err != nil { - return nil, err +/* +Use to read docker-compose file from the `fromfile` path , and outout file to the `tofile` path. +*/ +func ConvertFiletoFile(fromfile string, tofile string) { + if fromfile != "" { + dockercomposefile, err := os.ReadFile(fromfile) + if err != nil { + fmt.Printf("error: %v", err) + } + k1, err := loader.ParseYAML(dockercomposefile) + if err != nil { + fmt.Printf("error: %v", err) + } + tmpk := k1["services"] + tmp3, _ := tmpk.(map[string]interface{}) + services, err := LoadServices(tmp3) + containers, err := TransServicesToContainer(services) + var f1 = batecttypes.BatectConfig{ + Containers: containers, + } + batectyaml, err := yaml.Marshal(&f1) + if err != nil { + fmt.Printf("error: %v", err) + } + err = os.WriteFile(tofile, batectyaml, 0644) + if err != nil { + fmt.Printf("%v", err) + } } - return batectyaml, nil } diff --git a/go.mod b/go.mod index 09a00f3..e29d222 100644 --- a/go.mod +++ b/go.mod @@ -25,6 +25,6 @@ require ( github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect - golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect + golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index ec3139d..b6cfaf5 100644 --- a/go.sum +++ b/go.sum @@ -152,8 +152,9 @@ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/testdata/batect.yml b/testdata/batect.yml deleted file mode 100644 index bb254ea..0000000 --- a/testdata/batect.yml +++ /dev/null @@ -1,50 +0,0 @@ -containers: - jobaggrv-api: - build_args: - GIT_COMMIT: cdc3b19 - build_directory: . - dependencies: - - jobaggrv-scrapy - dockerfile: ./Dockerfile - entrypoint: gunicorn --worker-class gevent -w 4 --worker-connections 1000 -b 0.0.0.0:8000 jobaggrv_api.app:app - log_driver: syslog - log_options: - syslog-address: tcp://192.168.0.42:123 - ports: - - 8000:8000 - jobaggrv-mysql: - additional_hosts: - otherhost: 50.31.209.229 - somehost: 162.242.195.82 - capabilities_to_add: - - ALL - capabilities_to_drop: - - NET_ADMIN - - SYS_ADMIN - environment: - MYSQL_DATABASE: jobaggrv - MYSQL_PASSWORD: jobaggrv - MYSQL_ROOT_PASSWORD: jobaggrv - MYSQL_USER: jobaggrv - health_check: - command: CMD curl -f http://localhost - retries: 3 - interval: 1m30s - start_period: 40s - timeout: 10s - image: mysql:8-debian - ports: - - 33060:3306 - jobaggrv-scrapy: - build_args: - GIT_COMMIT: cdc3b19 - build_directory: . - build_target: prod - command: echo I'm running ${COMPOSE_PROJECT_NAME} - devices: - - /dev/ttyUSB0:/dev/ttyUSB0 - - /dev/sda:/dev/xvda:rwm - dockerfile: ./Dockerfile - enable_init_process: true - shm_size: "1048576" - working_directory: /opt diff --git a/testdata/docker-compose.yml b/testdata/docker-compose.yml deleted file mode 100644 index 7aaf146..0000000 --- a/testdata/docker-compose.yml +++ /dev/null @@ -1,58 +0,0 @@ -version: '3' - -services: - - jobaggrv-mysql: - image: mysql:8-debian - extra_hosts: - - "somehost:162.242.195.82" - - "otherhost:50.31.209.229" - environment: - MYSQL_ROOT_PASSWORD: jobaggrv - MYSQL_USER: jobaggrv - MYSQL_PASSWORD: jobaggrv - MYSQL_DATABASE: jobaggrv - ports: - - 33060:3306 - cap_add: - - ALL - cap_drop: - - NET_ADMIN - - SYS_ADMIN - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost"] - interval: 1m30s - timeout: 10s - retries: 3 - start_period: 40s - - jobaggrv-scrapy: - build: - dockerfile: ./Dockerfile - context: . - target: prod - args: - GIT_COMMIT: cdc3b19 - command: echo "I'm running ${COMPOSE_PROJECT_NAME}" - devices: - - "/dev/ttyUSB0:/dev/ttyUSB0" - - "/dev/sda:/dev/xvda:rwm" - init: true - shm_size: 1024kb - working_dir: /opt - - jobaggrv-api: - build: - dockerfile: ./Dockerfile - context: . - args: - - GIT_COMMIT=cdc3b19 - entrypoint: gunicorn --worker-class gevent -w 4 --worker-connections 1000 -b 0.0.0.0:8000 'jobaggrv_api.app:app' - ports: - - 8000:8000 - depends_on: - - jobaggrv-scrapy - logging: - driver: syslog - options: - syslog-address: "tcp://192.168.0.42:123"