You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ts...@apache.org on 2022/08/07 13:01:35 UTC
[camel-k] 05/09: chore(cli): further refactor kamel local cmds
This is an automated email from the ASF dual-hosted git repository.
tsato pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit a61394e1911c2871db04f3305f4b6f55ecdfde27
Author: Tadayoshi Sato <sa...@gmail.com>
AuthorDate: Fri Jul 29 14:10:52 2022 +0900
chore(cli): further refactor kamel local cmds
---
pkg/cmd/local_build.go | 14 ++-
pkg/cmd/local_inspect.go | 11 ++-
pkg/cmd/local_run.go | 183 +++++++++++++++++++++-------------------
pkg/cmd/local_util.go | 69 +++++++--------
pkg/cmd/local_util_container.go | 5 +-
pkg/util/util.go | 15 ----
6 files changed, 147 insertions(+), 150 deletions(-)
diff --git a/pkg/cmd/local_build.go b/pkg/cmd/local_build.go
index bc506c27b..fba6d4d82 100644
--- a/pkg/cmd/local_build.go
+++ b/pkg/cmd/local_build.go
@@ -58,8 +58,10 @@ func newCmdLocalBuild(localCmdOptions *LocalCmdOptions) (*cobra.Command, *localB
}
cmd.Flags().Bool("base-image", false, "Build base image used as a starting point for any integration.")
- cmd.Flags().Bool("dependencies-only", false, "Only output the integration dependencies. The integration-directory flag must be set.")
- cmd.Flags().String("container-registry", "", "Registry that holds intermediate images. This flag should only be used in conjunction with the base-image flag.")
+ cmd.Flags().Bool("dependencies-only", false,
+ "Only output the integration dependencies. The integration-directory flag must be set.")
+ cmd.Flags().String("container-registry", "",
+ "Registry that holds intermediate images. This flag should only be used in conjunction with the base-image flag.")
cmd.Flags().String("image", "", "Full path to integration image including registry.")
cmd.Flags().String("integration-directory", "", "Directory to hold local integration files.")
cmd.Flags().StringArray("property-file", nil, "Add a property file to the integration.")
@@ -84,7 +86,7 @@ type localBuildCmdOptions struct {
func (o *localBuildCmdOptions) validate(args []string) error {
// Validate integration files.
if len(args) > 0 {
- if err := validateIntegrationFiles(args); err != nil {
+ if err := validateFiles(args); err != nil {
return err
}
}
@@ -149,11 +151,7 @@ func (o *localBuildCmdOptions) init(args []string) error {
}
}
- if err := createMavenWorkingDirectory(); err != nil {
- return err
- }
-
- return nil
+ return createMavenWorkingDirectory()
}
func (o *localBuildCmdOptions) run(cmd *cobra.Command, args []string) error {
diff --git a/pkg/cmd/local_inspect.go b/pkg/cmd/local_inspect.go
index 1c180d56b..e5df5bd7b 100644
--- a/pkg/cmd/local_inspect.go
+++ b/pkg/cmd/local_inspect.go
@@ -18,6 +18,7 @@ limitations under the License.
package cmd
import (
+ "errors"
"fmt"
"github.com/spf13/cobra"
@@ -71,7 +72,12 @@ type localInspectCmdOptions struct {
}
func (o *localInspectCmdOptions) validate(args []string) error {
- if err := validateIntegrationFiles(args); err != nil {
+ // If no source files have been provided there is nothing to inspect.
+ if len(args) == 0 {
+ return errors.New("no integration files have been provided")
+ }
+
+ if err := validateFiles(args); err != nil {
return err
}
@@ -92,8 +98,7 @@ func (o *localInspectCmdOptions) run(cmd *cobra.Command, args []string) error {
return err
}
- err = outputDependencies(dependencies, o.OutputFormat, cmd)
- if err != nil {
+ if err = outputDependencies(dependencies, o.OutputFormat, cmd); err != nil {
return err
}
diff --git a/pkg/cmd/local_run.go b/pkg/cmd/local_run.go
index 62e53205a..d424a8e8c 100644
--- a/pkg/cmd/local_run.go
+++ b/pkg/cmd/local_run.go
@@ -74,7 +74,8 @@ func newCmdLocalRun(localCmdOptions *LocalCmdOptions) (*cobra.Command, *localRun
cmd.Flags().Bool("containerize", false, "Run integration in a local container.")
cmd.Flags().String("image", "", "Full path to integration image including registry.")
cmd.Flags().String("network", "", "Custom network name to be used by the underlying Docker command.")
- cmd.Flags().String("integration-directory", "", "Directory which holds the locally built integration and is the result of a local build action.")
+ cmd.Flags().String("integration-directory", "",
+ "Directory which holds the locally built integration and is the result of a local build action.")
cmd.Flags().StringArrayP("env", "e", nil, "Flag to specify an environment variable [--env VARIABLE=value].")
cmd.Flags().StringArray("property-file", nil, "Add a property file to the integration.")
cmd.Flags().StringArrayP("property", "p", nil, "Add a Camel property to the integration.")
@@ -99,7 +100,12 @@ func (o *localRunCmdOptions) validate(args []string) error {
// Validate integration files when no image is provided and we are
// not running an already locally-built integration.
if o.Image == "" && o.IntegrationDirectory == "" {
- if err := validateIntegrationFiles(args); err != nil {
+ if len(args) == 0 {
+ return errors.New("no integration files have been provided")
+ }
+
+ // Validate integration files.
+ if err := validateFiles(args); err != nil {
return err
}
}
@@ -144,129 +150,132 @@ func (o *localRunCmdOptions) run(cmd *cobra.Command, args []string) error {
// If local run is provided with an image name, it will just run the image locally and exit.
if o.Image != "" && !o.Containerize {
// Run image locally.
- if err := runIntegrationImage(o.Context, o.Image, cmd.OutOrStdout(), cmd.ErrOrStderr()); err != nil {
+ return runIntegrationImage(o.Context, o.Image, cmd.OutOrStdout(), cmd.ErrOrStderr())
+ }
+
+ dependencies, err := o.processDependencies(args)
+ if err != nil {
+ return err
+ }
+ propertyFiles, err := o.processPropertyFiles()
+ if err != nil {
+ return err
+ }
+ routes, err := o.processRoutes(args)
+ if err != nil {
+ return err
+ }
+
+ if o.Containerize {
+ // If this is a containerized local run, create, build and run the container image.
+ if err := createAndBuildIntegrationImage(o.Context, "", false, o.Image,
+ propertyFiles, dependencies, routes, o.IntegrationDirectory != "",
+ cmd.OutOrStdout(), cmd.ErrOrStderr()); err != nil {
return err
}
- return nil
+ // Run integration image.
+ return runIntegrationImage(o.Context, o.Image, cmd.OutOrStdout(), cmd.ErrOrStderr())
}
- hasIntegrationDir := o.IntegrationDirectory != ""
+ // Run integration locally.
+ return RunLocalIntegrationRunCommand(o.Context, propertyFiles, dependencies, routes, o.getPropertiesDir(),
+ cmd.OutOrStdout(), cmd.ErrOrStderr())
+}
- var dependencies []string
- if hasIntegrationDir {
- // Fetch local dependencies
- localBuildDependencies, err := getLocalBuildDependencies(o.IntegrationDirectory)
- if err != nil {
- return err
- }
- dependencies = localBuildDependencies
+func (o *localRunCmdOptions) processDependencies(args []string) ([]string, error) {
+ if o.IntegrationDirectory == "" {
+ return getDependencies(o.Context, args, o.Dependencies, o.MavenRepositories, true)
+ }
- // Local dependencies directory
- localDependenciesDirectory := getCustomDependenciesDir(o.IntegrationDirectory)
+ // Set up on the integration directory
- // The quarkus application files need to be at a specific location i.e.:
- // <integration_directory>/../quarkus/quarkus-application.dat
- // <integration_directory>/../quarkus/generated-bytecode.jar
- localQuarkusDir := getCustomQuarkusDir(o.IntegrationDirectory)
- err = copyQuarkusAppFiles(localDependenciesDirectory, localQuarkusDir)
- if err != nil {
- return err
- }
+ // Fetch local dependencies
+ dependencies, err := getLocalBuildDependencies(o.IntegrationDirectory)
+ if err != nil {
+ return nil, err
+ }
+ if err := o.setupDependenciesForQuarkusRun(); err != nil {
+ return dependencies, err
+ }
- // The dependency jar files need to be at a specific location i.e.:
- // <integration_directory>/../lib/main/*.jar
- localLibDirectory := getCustomLibDir(o.IntegrationDirectory)
- err = copyLibFiles(localDependenciesDirectory, localLibDirectory)
- if err != nil {
- return err
- }
+ return dependencies, nil
+}
- // The Camel K jar file needs to be at a specific location i.e.:
- // <integration_directory>/../app/camel-k-integration-X.X.X{-SNAPSHOT}.jar
- localAppDirectory := getCustomAppDir(o.IntegrationDirectory)
- err = copyAppFile(localDependenciesDirectory, localAppDirectory)
- if err != nil {
- return err
- }
- } else {
- computedDependencies, err := getDependencies(o.Context, args, o.Dependencies, o.MavenRepositories, true)
- if err != nil {
- return err
- }
- dependencies = computedDependencies
+// setupDependenciesForQuarkusRun sets up resources under the integration directory for running Quarkus app.
+func (o *localRunCmdOptions) setupDependenciesForQuarkusRun() error {
+ // Local dependencies directory
+ localDependenciesDir := getCustomDependenciesDir(o.IntegrationDirectory)
+
+ // The quarkus application files need to be at a specific location i.e.:
+ // <integration_directory>/../quarkus/quarkus-application.dat
+ // <integration_directory>/../quarkus/generated-bytecode.jar
+ localQuarkusDir := getCustomQuarkusDir(o.IntegrationDirectory)
+ if err := copyQuarkusAppFiles(localDependenciesDir, localQuarkusDir); err != nil {
+ return err
}
- // Manage integration properties which may come from files or CLI.
- propertyFiles := o.PropertyFiles
- if hasIntegrationDir {
- localBuildPropertyFiles, err := getLocalBuildProperties(o.IntegrationDirectory)
- if err != nil {
- return err
- }
- propertyFiles = localBuildPropertyFiles
+ // The dependency jar files need to be at a specific location i.e.:
+ // <integration_directory>/../lib/main/*.jar
+ localLibDir := getCustomLibDir(o.IntegrationDirectory)
+ if err := copyLibFiles(localDependenciesDir, localLibDir); err != nil {
+ return err
}
- updatedPropertyFiles, err := updateIntegrationProperties(o.Properties, propertyFiles, hasIntegrationDir)
- if err != nil {
+ // The Camel K jar file needs to be at a specific location i.e.:
+ // <integration_directory>/../app/camel-k-integration-X.X.X{-SNAPSHOT}.jar
+ localAppDir := getCustomAppDir(o.IntegrationDirectory)
+ if err := copyAppFile(localDependenciesDir, localAppDir); err != nil {
return err
}
- propertyFiles = updatedPropertyFiles
- routes := args
+ return nil
+}
+
+// processPropertyFiles processes integration properties which may come from files or CLI.
+func (o *localRunCmdOptions) processPropertyFiles() ([]string, error) {
+ propertyFiles := o.PropertyFiles
+ hasIntegrationDir := o.IntegrationDirectory != ""
if hasIntegrationDir {
- localBuildRoutes, err := getLocalBuildRoutes(o.IntegrationDirectory)
+ localPropertyFiles, err := getLocalBuildProperties(o.IntegrationDirectory)
if err != nil {
- return err
+ return nil, err
}
- routes = localBuildRoutes
+ propertyFiles = localPropertyFiles
}
- // If this is a containerized local run, create, build and run the container image.
- if o.Containerize {
- if err := createAndBuildIntegrationImage(o.Context, "", false, o.Image,
- propertyFiles, dependencies, routes, hasIntegrationDir,
- cmd.OutOrStdout(), cmd.ErrOrStderr()); err != nil {
- return err
- }
+ return updateIntegrationProperties(o.Properties, propertyFiles, hasIntegrationDir)
+}
- // Run integration image.
- err = runIntegrationImage(o.Context, o.Image, cmd.OutOrStdout(), cmd.ErrOrStderr())
- if err != nil {
- return err
- }
- } else {
- propertiesDir := getLocalPropertiesDir()
- if hasIntegrationDir {
- propertiesDir = getCustomPropertiesDir(o.IntegrationDirectory)
- }
+func (o *localRunCmdOptions) processRoutes(args []string) ([]string, error) {
+ if o.IntegrationDirectory == "" {
+ return args, nil
+ }
- // Run integration locally.
- err := RunLocalIntegrationRunCommand(o.Context, propertyFiles, dependencies, routes, propertiesDir, cmd.OutOrStdout(), cmd.ErrOrStderr())
- if err != nil {
- return err
- }
+ return getLocalBuildRoutes(o.IntegrationDirectory)
+}
+
+func (o *localRunCmdOptions) getPropertiesDir() string {
+ if o.IntegrationDirectory == "" {
+ return getLocalPropertiesDir()
}
- return nil
+ return getCustomPropertiesDir(o.IntegrationDirectory)
}
func (o *localRunCmdOptions) deinit() error {
if o.Containerize {
- err := deleteDockerBaseWorkingDirectory()
- if err != nil {
+ if err := deleteDockerBaseWorkingDirectory(); err != nil {
return err
}
- err = deleteDockerWorkingDirectory()
- if err != nil {
+ if err := deleteDockerWorkingDirectory(); err != nil {
return err
}
}
if o.IntegrationDirectory != "" {
- err := deleteLocalIntegrationDirs(o.IntegrationDirectory)
- if err != nil {
+ if err := deleteLocalIntegrationDirs(o.IntegrationDirectory); err != nil {
return err
}
}
diff --git a/pkg/cmd/local_util.go b/pkg/cmd/local_util.go
index bc0d26619..166489a7a 100644
--- a/pkg/cmd/local_util.go
+++ b/pkg/cmd/local_util.go
@@ -19,6 +19,7 @@ package cmd
import (
"context"
+ "encoding/json"
"fmt"
"io/ioutil"
"os"
@@ -236,8 +237,7 @@ func createCamelCatalog(ctx context.Context) (*camel.RuntimeCatalog, error) {
func outputDependencies(dependencies []string, format string, cmd *cobra.Command) error {
if format != "" {
- err := printDependencies(format, dependencies, cmd)
- if err != nil {
+ if err := printDependencies(format, dependencies, cmd); err != nil {
return err
}
} else {
@@ -254,23 +254,38 @@ func outputDependencies(dependencies []string, format string, cmd *cobra.Command
func printDependencies(format string, dependencies []string, cmd *cobra.Command) error {
switch format {
case "yaml":
- data, err := util.DependenciesToYAML(dependencies)
+ data, err := dependenciesToYAML(dependencies)
if err != nil {
return err
}
fmt.Fprint(cmd.OutOrStdout(), string(data))
case "json":
- data, err := util.DependenciesToJSON(dependencies)
+ data, err := dependenciesToJSON(dependencies)
if err != nil {
return err
}
fmt.Fprint(cmd.OutOrStdout(), string(data))
default:
- return errors.New("unknown output format: " + format)
+ return errors.Errorf("unknown output format: %s", format)
}
return nil
}
+func dependenciesToJSON(list []string) ([]byte, error) {
+ jsondata := map[string]interface{}{}
+ jsondata["dependencies"] = list
+ return json.Marshal(jsondata)
+}
+
+func dependenciesToYAML(list []string) ([]byte, error) {
+ data, err := dependenciesToJSON(list)
+ if err != nil {
+ return nil, err
+ }
+
+ return util.JSONToYAML(data)
+}
+
func validateFile(file string) error {
fileExists, err := util.FileExists(file)
if err != nil {
@@ -310,20 +325,6 @@ func validateDependencies(dependencies []string) error {
return nil
}
-func validateIntegrationFiles(args []string) error {
- // If no source files have been provided there is nothing to inspect.
- if len(args) == 0 {
- return errors.New("no integration files have been provided")
- }
-
- // Validate integration files.
- if err := validateFiles(args); err != nil {
- return err
- }
-
- return nil
-}
-
func validatePropertyFiles(propertyFiles []string) error {
for _, fileName := range propertyFiles {
if err := validatePropertyFile(fileName); err != nil {
@@ -472,21 +473,21 @@ func copyIntegrationFilesToDirectory(files []string, directory string) ([]string
return relocatedFilesList, nil
}
-func copyQuarkusAppFiles(localDependenciesDirectory string, localQuarkusDir string) error {
+func copyQuarkusAppFiles(dependenciesDir string, quarkusDir string) error {
// Create directory if one does not already exist
- if err := util.CreateDirectory(localQuarkusDir); err != nil {
+ if err := util.CreateDirectory(quarkusDir); err != nil {
return err
}
// Transfer all files with a .dat extension and all files with a *-bytecode.jar suffix.
- files, err := getRegularFilesInDir(localDependenciesDirectory, false)
+ files, err := getRegularFilesInDir(dependenciesDir, false)
if err != nil {
return err
}
for _, file := range files {
if strings.HasSuffix(file, ".dat") || strings.HasSuffix(file, "-bytecode.jar") {
- source := path.Join(localDependenciesDirectory, file)
- destination := path.Join(localQuarkusDir, file)
+ source := path.Join(dependenciesDir, file)
+ destination := path.Join(quarkusDir, file)
if _, err = util.CopyFile(source, destination); err != nil {
return err
}
@@ -496,20 +497,20 @@ func copyQuarkusAppFiles(localDependenciesDirectory string, localQuarkusDir stri
return nil
}
-func copyLibFiles(localDependenciesDirectory string, localLibDirectory string) error {
+func copyLibFiles(dependenciesDir string, libDir string) error {
// Create directory if one does not already exist
- if err := util.CreateDirectory(localLibDirectory); err != nil {
+ if err := util.CreateDirectory(libDir); err != nil {
return err
}
- fileNames, err := getRegularFilesInDir(localDependenciesDirectory, false)
+ fileNames, err := getRegularFilesInDir(dependenciesDir, false)
if err != nil {
return err
}
for _, dependencyJar := range fileNames {
- source := path.Join(localDependenciesDirectory, dependencyJar)
- destination := path.Join(localLibDirectory, dependencyJar)
+ source := path.Join(dependenciesDir, dependencyJar)
+ destination := path.Join(libDir, dependencyJar)
if _, err = util.CopyFile(source, destination); err != nil {
return err
}
@@ -518,21 +519,21 @@ func copyLibFiles(localDependenciesDirectory string, localLibDirectory string) e
return nil
}
-func copyAppFile(localDependenciesDirectory string, localAppDirectory string) error {
+func copyAppFile(dependenciesDir string, appDir string) error {
// Create directory if one does not already exist
- if err := util.CreateDirectory(localAppDirectory); err != nil {
+ if err := util.CreateDirectory(appDir); err != nil {
return err
}
- fileNames, err := getRegularFilesInDir(localDependenciesDirectory, false)
+ fileNames, err := getRegularFilesInDir(dependenciesDir, false)
if err != nil {
return err
}
for _, dependencyJar := range fileNames {
if strings.HasPrefix(dependencyJar, "camel-k-integration-") {
- source := path.Join(localDependenciesDirectory, dependencyJar)
- destination := path.Join(localAppDirectory, dependencyJar)
+ source := path.Join(dependenciesDir, dependencyJar)
+ destination := path.Join(appDir, dependencyJar)
if _, err = util.CopyFile(source, destination); err != nil {
return err
}
diff --git a/pkg/cmd/local_util_container.go b/pkg/cmd/local_util_container.go
index e2bcdd191..a10c49025 100644
--- a/pkg/cmd/local_util_container.go
+++ b/pkg/cmd/local_util_container.go
@@ -190,11 +190,10 @@ func createAndBuildIntegrationImage(ctx context.Context, containerRegistry strin
return err
}
- return buildIntegrationImage(ctx, image, startsFromLocalFolder, stdout, stderr)
+ return buildIntegrationImage(ctx, image, stdout, stderr)
}
-func buildIntegrationImage(ctx context.Context, image string, startsFromLocalFolder bool,
- stdout, stderr io.Writer) error {
+func buildIntegrationImage(ctx context.Context, image string, stdout, stderr io.Writer) error {
// Get the Docker command arguments for building the base image and create the command.
args := docker.BuildIntegrationImageArgs(image, MavenWorkingDirectory)
cmd := exec.CommandContext(ctx, "docker", args...)
diff --git a/pkg/util/util.go b/pkg/util/util.go
index 878c5913d..25ca86517 100644
--- a/pkg/util/util.go
+++ b/pkg/util/util.go
@@ -423,21 +423,6 @@ func CopyMap(source map[string]string) map[string]string {
return dest
}
-func DependenciesToJSON(list []string) ([]byte, error) {
- jsondata := map[string]interface{}{}
- jsondata["dependencies"] = list
- return json.Marshal(jsondata)
-}
-
-func DependenciesToYAML(list []string) ([]byte, error) {
- data, err := DependenciesToJSON(list)
- if err != nil {
- return nil, err
- }
-
- return JSONToYAML(data)
-}
-
func JSONToYAML(src []byte) ([]byte, error) {
mapdata, err := JSONToMap(src)
if err != nil {