This is an automated email from the ASF dual-hosted git repository. nferraro pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel-k.git
commit 9edff327323334b9e9b14063a980ba86b8fa4b9f Author: Doru Bercea <[email protected]> AuthorDate: Tue Nov 3 16:38:33 2020 -0500 Factor out common code between inspect and run-local commands. --- pkg/cmd/inspect.go | 266 +------------------------- pkg/cmd/local_run.go | 77 +++----- pkg/cmd/{inspect.go => util_dependencies.go} | 269 ++++++++++++--------------- 3 files changed, 140 insertions(+), 472 deletions(-) diff --git a/pkg/cmd/inspect.go b/pkg/cmd/inspect.go index 02eed21..e524e56 100644 --- a/pkg/cmd/inspect.go +++ b/pkg/cmd/inspect.go @@ -19,27 +19,11 @@ package cmd import ( "fmt" - "io/ioutil" - "os" - "path" "strings" - v1 "github.com/apache/camel-k/pkg/apis/camel/v1" - "github.com/apache/camel-k/pkg/builder/runtime" - "github.com/apache/camel-k/pkg/trait" - "github.com/apache/camel-k/pkg/util" - "github.com/apache/camel-k/pkg/util/camel" - "github.com/apache/camel-k/pkg/util/defaults" - "github.com/apache/camel-k/pkg/util/maven" - "github.com/pkg/errors" - "github.com/scylladb/go-set/strset" "github.com/spf13/cobra" ) -var acceptedDependencyTypes = []string{"bom", "camel", "camel-k", "camel-quarkus", "mvn", "github"} - -const defaultDependenciesDirectoryName = "dependencies" - func newCmdInspect(rootCmdOptions *RootCmdOptions) (*cobra.Command, *inspectCmdOptions) { options := inspectCmdOptions{ RootCmdOptions: rootCmdOptions, @@ -84,261 +68,21 @@ type inspectCmdOptions struct { } func (command *inspectCmdOptions) validate(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, nothing to inspect") - } - - // Ensure source files exist. - for _, arg := range args { - // fmt.Printf("Validating file: %v\n", arg) - fileExists, err := util.FileExists(arg) - - // Report any error. - if err != nil { - return err - } - - // Signal file not found. - if !fileExists { - return errors.New("input file " + arg + " file does not exist") - } - } - - // Validate list of additional dependencies i.e. make sure that each dependency has - // a valid type. - if command.AdditionalDependencies != nil { - for _, additionalDependency := range command.AdditionalDependencies { - dependencyComponents := strings.Split(additionalDependency, ":") - - TypeIsValid := false - for _, dependencyType := range acceptedDependencyTypes { - if dependencyType == dependencyComponents[0] { - TypeIsValid = true - } - } - - if !TypeIsValid { - return errors.New("Unexpected type for user-provided dependency: " + additionalDependency + ", check command usage for valid format.") - } - - } - } - - return nil + return validateIntegrationForDependencies(args, command.AdditionalDependencies) } func (command *inspectCmdOptions) run(args []string) error { - // Fetch existing catalog or create new one if one does not already exist. - catalog, err := createCamelCatalog() - - // Get top-level dependencies, this is the default behavior when no other options are provided. - // Do not output these options when transitive options are enbled. - dependencies, err := getTopLevelDependencies(catalog, command.OutputFormat, args, !command.AllDependencies) - if err != nil { - return err - } - - // Add additional user-provided dependencies. - if command.AdditionalDependencies != nil { - for _, additionalDependency := range command.AdditionalDependencies { - dependencies = append(dependencies, additionalDependency) - } - } - - // Top level dependencies are printed out. - if command.AllDependencies { - // If --all-dependencies flag is set, move all transitive dependencies in the --dependencies-directory. - err = getTransitiveDependencies(catalog, dependencies, command) - if err != nil { - return err - } - } - - return nil -} - -func getTopLevelDependencies(catalog *camel.RuntimeCatalog, format string, args []string, printDependencies bool) ([]string, error) { - // List of top-level dependencies. - dependencies := strset.New() - - // Invoke the dependency inspector code for each source file. - for _, source := range args { - data, _, err := loadContent(source, false, false) - if err != nil { - return []string{}, err - } - - sourceSpec := v1.SourceSpec{ - DataSpec: v1.DataSpec{ - Name: path.Base(source), - Content: data, - Compression: false, - }, - } - - // Extract list of top-level dependencies. - dependencies.Merge(trait.AddSourceDependencies(sourceSpec, catalog)) - } - - if printDependencies { - err := outputDependencies(dependencies.List(), format) - if err != nil { - return []string{}, err - } - } - - return dependencies.List(), nil -} - -func generateCatalog() (*camel.RuntimeCatalog, error) { - // A Camel catalog is requiref for this operatio. - settings := "" - mvn := v1.MavenSpec{ - LocalRepository: "", - } - runtime := v1.RuntimeSpec{ - Version: defaults.DefaultRuntimeVersion, - Provider: v1.RuntimeProviderQuarkus, - } - providerDependencies := []maven.Dependency{} - catalog, err := camel.GenerateCatalogCommon(settings, mvn, runtime, providerDependencies) - if err != nil { - return nil, err - } - - return catalog, nil -} - -func getTransitiveDependencies( - catalog *camel.RuntimeCatalog, - dependencies []string, - command *inspectCmdOptions) error { - - mvn := v1.MavenSpec{ - LocalRepository: "", - } - - // Create Maven project. - project := runtime.GenerateQuarkusProjectCommon( - catalog.CamelCatalogSpec.Runtime.Metadata["camel-quarkus.version"], - defaults.DefaultRuntimeVersion, catalog.CamelCatalogSpec.Runtime.Metadata["quarkus.version"]) - - // Inject dependencies into Maven project. - err := camel.ManageIntegrationDependencies(&project, dependencies, catalog) - if err != nil { - return err - } - - // Create local Maven context. - temporaryDirectory, err := ioutil.TempDir(os.TempDir(), "maven-") + // Fetch dependencies. + dependencies, err := getDependencies(args, command.AdditionalDependencies, command.AllDependencies) if err != nil { return err } - // Maven local context to be used for generating the transitive dependencies. - mc := maven.NewContext(temporaryDirectory, project) - mc.LocalRepository = mvn.LocalRepository - mc.Timeout = mvn.GetTimeout().Duration - - // Make maven command less verbose. - mc.AdditionalArguments = append(mc.AdditionalArguments, "-q") - - err = runtime.BuildQuarkusRunnerCommon(mc) + // Print dependencies. + err = outputDependencies(dependencies, command.OutputFormat) if err != nil { return err } - // Compute dependencies. - content, err := runtime.ComputeQuarkusDependenciesCommon(mc, catalog.Runtime.Version) - if err != nil { - return err - } - - // Compose artifacts list. - artifacts := []v1.Artifact{} - artifacts, err = runtime.ProcessQuarkusTransitiveDependencies(mc, content) - if err != nil { - return err - } - - // Dump dependencies in the dependencies directory and construct the list of dependencies. - transitiveDependencies := []string{} - for _, entry := range artifacts { - transitiveDependencies = append(transitiveDependencies, entry.Location) - } - - // Remove directory used for computing the dependencies. - defer os.RemoveAll(temporaryDirectory) - - // Output transitive dependencies only if requested via the output format flag. - err = outputDependencies(transitiveDependencies, command.OutputFormat) - if err != nil { - return err - } - - return nil -} - -func outputDependencies(dependencies []string, format string) error { - if format != "" { - err := printDependencies(format, dependencies) - if err != nil { - return err - } - } else { - // Print output in text form. - for _, dep := range dependencies { - fmt.Printf("%v\n", dep) - } - } - return nil } - -func printDependencies(format string, dependecies []string) error { - switch format { - case "yaml": - data, err := util.DependenciesToYAML(dependecies) - if err != nil { - return err - } - fmt.Print(string(data)) - case "json": - data, err := util.DependenciesToJSON(dependecies) - if err != nil { - return err - } - fmt.Print(string(data)) - default: - return errors.New("unknown output format: " + format) - } - return nil -} - -func getWorkingDirectory() (string, error) { - currentDirectory, err := os.Getwd() - if err != nil { - return "", err - } - - return currentDirectory, nil -} - -func createCamelCatalog() (*camel.RuntimeCatalog, error) { - // Attempt to reuse existing Camel catalog if one is present. - catalog, err := camel.DefaultCatalog() - if err != nil { - return nil, err - } - - // Generate catalog if one was not found. - if catalog == nil { - catalog, err = generateCatalog() - if err != nil { - return nil, err - } - } - - return catalog, nil -} diff --git a/pkg/cmd/local_run.go b/pkg/cmd/local_run.go index 70af154..8a0bdb2 100644 --- a/pkg/cmd/local_run.go +++ b/pkg/cmd/local_run.go @@ -18,15 +18,9 @@ limitations under the License. package cmd import ( - "errors" "fmt" - "path" + "strings" - v1 "github.com/apache/camel-k/pkg/apis/camel/v1" - "github.com/apache/camel-k/pkg/trait" - "github.com/apache/camel-k/pkg/util" - "github.com/apache/camel-k/pkg/util/camel" - "github.com/scylladb/go-set/strset" "github.com/spf13/cobra" ) @@ -55,76 +49,47 @@ func newCmdLocalRun(rootCmdOptions *RootCmdOptions) (*cobra.Command, *localRunCm }, } - cmd.Flags().StringP("properties", "p", "", "Output format. One of: json|yaml") + cmd.Flags().StringArrayP("properties-file", "p", nil, "File containing the integration properties.") + cmd.Flags().StringArrayP("dependency", "d", nil, `Additional top-level dependency with the format: +<type>:<dependency-name> +where <type> is one of {`+strings.Join(acceptedDependencyTypes, "|")+`}.`) return &cmd, &options } type localRunCmdOptions struct { *RootCmdOptions - Properties string `mapstructure:"properties"` + PropertiesFiles []string `mapstructure:"properties"` + AdditionalDependencies []string `mapstructure:"dependencies"` } func (command *localRunCmdOptions) validate(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, nothing to inspect") + // Validate additional dependencies specified by the user. + err := validateIntegrationForDependencies(args, command.AdditionalDependencies) + if err != nil { + return err } - // Ensure source files exist. - for _, arg := range args { - // fmt.Printf("Validating file: %v\n", arg) - fileExists, err := util.FileExists(arg) - - // Report any error. - if err != nil { - return err - } - - // Signal file not found. - if !fileExists { - return errors.New("input file " + arg + " file does not exist") - } + // Validate properties file. + err = validateFiles(command.PropertiesFiles) + if err != nil { + return nil } return nil } func (command *localRunCmdOptions) run(args []string) error { - // Attempt to reuse existing Camel catalog if one is present. - catalog, err := camel.MainCatalog() + // Fetch dependencies. + dependencies, err := getDependencies(args, command.AdditionalDependencies, true) if err != nil { return err } - // Generate catalog if one was not found. - if catalog == nil { - catalog, err = generateCatalog() - if err != nil { - return err - } - } - - // List of top-level dependencies. - dependencies := strset.New() - - // Invoke the dependency inspector code for each source file. - for _, source := range args { - data, _, err := loadContent(source, false, false) - if err != nil { - return err - } - - sourceSpec := v1.SourceSpec{ - DataSpec: v1.DataSpec{ - Name: path.Base(source), - Content: data, - Compression: false, - }, - } - - // Extract list of top-level dependencies. - dependencies.Merge(trait.AddSourceDependencies(sourceSpec, catalog)) + // Print dependencies. + err = outputDependencies(dependencies, "") + if err != nil { + return err } return nil diff --git a/pkg/cmd/inspect.go b/pkg/cmd/util_dependencies.go similarity index 64% copy from pkg/cmd/inspect.go copy to pkg/cmd/util_dependencies.go index 02eed21..49d0d07 100644 --- a/pkg/cmd/inspect.go +++ b/pkg/cmd/util_dependencies.go @@ -33,132 +33,41 @@ import ( "github.com/apache/camel-k/pkg/util/maven" "github.com/pkg/errors" "github.com/scylladb/go-set/strset" - "github.com/spf13/cobra" ) var acceptedDependencyTypes = []string{"bom", "camel", "camel-k", "camel-quarkus", "mvn", "github"} const defaultDependenciesDirectoryName = "dependencies" -func newCmdInspect(rootCmdOptions *RootCmdOptions) (*cobra.Command, *inspectCmdOptions) { - options := inspectCmdOptions{ - RootCmdOptions: rootCmdOptions, - } - - cmd := cobra.Command{ - Use: "inspect [files to inspect]", - Short: "Generate dependencies list given integration files.", - Long: `Output dependencies for a list of integration files. By default this command returns the -top level dependencies only. When --all-dependencies is enabled, the transitive dependencies -will be generated by calling Maven and then printed in the selected output format.`, - PreRunE: decode(&options), - RunE: func(_ *cobra.Command, args []string) error { - if err := options.validate(args); err != nil { - return err - } - if err := options.run(args); err != nil { - fmt.Println(err.Error()) - } - - return nil - }, - Annotations: map[string]string{ - offlineCommandLabel: "true", - }, - } - - cmd.Flags().Bool("all-dependencies", false, "Compute transitive dependencies and move them to directory pointed to by the --dependencies-directory flag.") - cmd.Flags().StringArrayP("dependency", "d", nil, `Additional top-level dependency with the format: -<type>:<dependency-name> -where <type> is one of {`+strings.Join(acceptedDependencyTypes, "|")+`}.`) - cmd.Flags().StringP("output", "o", "", "Output format. One of: json|yaml") - - return &cmd, &options -} - -type inspectCmdOptions struct { - *RootCmdOptions - AllDependencies bool `mapstructure:"all-dependencies"` - OutputFormat string `mapstructure:"output"` - AdditionalDependencies []string `mapstructure:"dependencies"` -} - -func (command *inspectCmdOptions) validate(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, nothing to inspect") - } - - // Ensure source files exist. - for _, arg := range args { - // fmt.Printf("Validating file: %v\n", arg) - fileExists, err := util.FileExists(arg) - - // Report any error. - if err != nil { - return err - } - - // Signal file not found. - if !fileExists { - return errors.New("input file " + arg + " file does not exist") - } - } - - // Validate list of additional dependencies i.e. make sure that each dependency has - // a valid type. - if command.AdditionalDependencies != nil { - for _, additionalDependency := range command.AdditionalDependencies { - dependencyComponents := strings.Split(additionalDependency, ":") - - TypeIsValid := false - for _, dependencyType := range acceptedDependencyTypes { - if dependencyType == dependencyComponents[0] { - TypeIsValid = true - } - } - - if !TypeIsValid { - return errors.New("Unexpected type for user-provided dependency: " + additionalDependency + ", check command usage for valid format.") - } - - } - } - - return nil -} - -func (command *inspectCmdOptions) run(args []string) error { +func getDependencies(args []string, additionalDependencies []string, allDependencies bool) ([]string, error) { // Fetch existing catalog or create new one if one does not already exist. catalog, err := createCamelCatalog() - // Get top-level dependencies, this is the default behavior when no other options are provided. - // Do not output these options when transitive options are enbled. - dependencies, err := getTopLevelDependencies(catalog, command.OutputFormat, args, !command.AllDependencies) + // Get top-level dependencies. + dependencies, err := getTopLevelDependencies(catalog, args) if err != nil { - return err + return nil, err } // Add additional user-provided dependencies. - if command.AdditionalDependencies != nil { - for _, additionalDependency := range command.AdditionalDependencies { + if additionalDependencies != nil { + for _, additionalDependency := range additionalDependencies { dependencies = append(dependencies, additionalDependency) } } - // Top level dependencies are printed out. - if command.AllDependencies { - // If --all-dependencies flag is set, move all transitive dependencies in the --dependencies-directory. - err = getTransitiveDependencies(catalog, dependencies, command) + // Compute transitive dependencies. + if allDependencies { + dependencies, err = getTransitiveDependencies(catalog, dependencies) if err != nil { - return err + return nil, err } } - return nil + return dependencies, nil } -func getTopLevelDependencies(catalog *camel.RuntimeCatalog, format string, args []string, printDependencies bool) ([]string, error) { +func getTopLevelDependencies(catalog *camel.RuntimeCatalog, args []string) ([]string, error) { // List of top-level dependencies. dependencies := strset.New() @@ -181,39 +90,12 @@ func getTopLevelDependencies(catalog *camel.RuntimeCatalog, format string, args dependencies.Merge(trait.AddSourceDependencies(sourceSpec, catalog)) } - if printDependencies { - err := outputDependencies(dependencies.List(), format) - if err != nil { - return []string{}, err - } - } - return dependencies.List(), nil } -func generateCatalog() (*camel.RuntimeCatalog, error) { - // A Camel catalog is requiref for this operatio. - settings := "" - mvn := v1.MavenSpec{ - LocalRepository: "", - } - runtime := v1.RuntimeSpec{ - Version: defaults.DefaultRuntimeVersion, - Provider: v1.RuntimeProviderQuarkus, - } - providerDependencies := []maven.Dependency{} - catalog, err := camel.GenerateCatalogCommon(settings, mvn, runtime, providerDependencies) - if err != nil { - return nil, err - } - - return catalog, nil -} - func getTransitiveDependencies( catalog *camel.RuntimeCatalog, - dependencies []string, - command *inspectCmdOptions) error { + dependencies []string) ([]string, error) { mvn := v1.MavenSpec{ LocalRepository: "", @@ -227,13 +109,13 @@ func getTransitiveDependencies( // Inject dependencies into Maven project. err := camel.ManageIntegrationDependencies(&project, dependencies, catalog) if err != nil { - return err + return nil, err } // Create local Maven context. temporaryDirectory, err := ioutil.TempDir(os.TempDir(), "maven-") if err != nil { - return err + return nil, err } // Maven local context to be used for generating the transitive dependencies. @@ -246,20 +128,20 @@ func getTransitiveDependencies( err = runtime.BuildQuarkusRunnerCommon(mc) if err != nil { - return err + return nil, err } // Compute dependencies. content, err := runtime.ComputeQuarkusDependenciesCommon(mc, catalog.Runtime.Version) if err != nil { - return err + return nil, err } // Compose artifacts list. artifacts := []v1.Artifact{} artifacts, err = runtime.ProcessQuarkusTransitiveDependencies(mc, content) if err != nil { - return err + return nil, err } // Dump dependencies in the dependencies directory and construct the list of dependencies. @@ -271,13 +153,44 @@ func getTransitiveDependencies( // Remove directory used for computing the dependencies. defer os.RemoveAll(temporaryDirectory) - // Output transitive dependencies only if requested via the output format flag. - err = outputDependencies(transitiveDependencies, command.OutputFormat) + return transitiveDependencies, nil +} + +func generateCatalog() (*camel.RuntimeCatalog, error) { + // A Camel catalog is requiref for this operatio. + settings := "" + mvn := v1.MavenSpec{ + LocalRepository: "", + } + runtime := v1.RuntimeSpec{ + Version: defaults.DefaultRuntimeVersion, + Provider: v1.RuntimeProviderQuarkus, + } + providerDependencies := []maven.Dependency{} + catalog, err := camel.GenerateCatalogCommon(settings, mvn, runtime, providerDependencies) if err != nil { - return err + return nil, err } - return nil + return catalog, nil +} + +func createCamelCatalog() (*camel.RuntimeCatalog, error) { + // Attempt to reuse existing Camel catalog if one is present. + catalog, err := camel.DefaultCatalog() + if err != nil { + return nil, err + } + + // Generate catalog if one was not found. + if catalog == nil { + catalog, err = generateCatalog() + if err != nil { + return nil, err + } + } + + return catalog, nil } func outputDependencies(dependencies []string, format string) error { @@ -316,29 +229,75 @@ func printDependencies(format string, dependecies []string) error { return nil } -func getWorkingDirectory() (string, error) { - currentDirectory, err := os.Getwd() +func validateFile(file string) error { + fileExists, err := util.FileExists(file) + + // Report any error. if err != nil { - return "", err + return err } - return currentDirectory, nil + // Signal file not found. + if !fileExists { + return errors.New("File " + file + " file does not exist") + } + + return nil } -func createCamelCatalog() (*camel.RuntimeCatalog, error) { - // Attempt to reuse existing Camel catalog if one is present. - catalog, err := camel.DefaultCatalog() - if err != nil { - return nil, err +func validateFiles(args []string) error { + // Ensure source files exist. + for _, arg := range args { + err := validateFile(arg) + if err != nil { + return nil + } } - // Generate catalog if one was not found. - if catalog == nil { - catalog, err = generateCatalog() - if err != nil { - return nil, err + return nil +} + +func validateAdditionalDependencies(additionalDependencies []string) error { + // Validate list of additional dependencies i.e. make sure that each dependency has + // a valid type. + if additionalDependencies != nil { + for _, additionalDependency := range additionalDependencies { + dependencyComponents := strings.Split(additionalDependency, ":") + + TypeIsValid := false + for _, dependencyType := range acceptedDependencyTypes { + if dependencyType == dependencyComponents[0] { + TypeIsValid = true + } + } + + if !TypeIsValid { + return errors.New("Unexpected type for user-provided dependency: " + additionalDependency + ", check command usage for valid format.") + } + } } - return catalog, nil + return nil +} + +func validateIntegrationForDependencies(args []string, additionalDependencies []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. + err := validateFiles(args) + if err != nil { + return nil + } + + // Validate additional dependencies specified by the user. + err = validateAdditionalDependencies(additionalDependencies) + if err != nil { + return err + } + + return nil }
