in cli_tools/gce_vm_image_import/cli/cli.go [35:105]
func Main(args []string, toolLogger logging.ToolLogger, workflowDir string) error {
logging.RedirectGlobalLogsToUser(toolLogger)
ctx := context.Background()
// Interpreting the user's request occurs in three steps:
// 1. Parse the CLI arguments, without performing validation or population.
// 2. Instantiate API clients using authentication overrides from arguments,
// if they were provided.
// 3. Populate missing arguments using the API clients.
// 1. Parse the CLI arguments
importArgs, err := parseArgsFromUser(args)
if err != nil {
logFailure(importArgs, err)
return err
}
printOverriddenAPIsInfo(importArgs.EndpointsOverride)
importArgs.WorkflowDir = workflowDir
// 2. Setup dependencies.
storageClient, err := createStorageClient(ctx, importArgs, toolLogger)
if err != nil {
logFailure(importArgs, err)
return err
}
computeClient, err := param.CreateComputeClient(
&ctx, importArgs.Oauth, importArgs.EndpointsOverride.Compute)
if err != nil {
logFailure(importArgs, err)
return err
}
metadataGCE := &compute.MetadataGCE{}
paramPopulator := param.NewPopulator(
param.NewNetworkResolver(computeClient),
metadataGCE,
storageClient,
storage.NewResourceLocationRetriever(metadataGCE, computeClient),
storage.NewScratchBucketCreator(ctx, storageClient),
param.NewMachineSeriesDetector(computeClient),
)
// 3. Populate missing arguments.
err = importArgs.populateAndValidate(paramPopulator,
importer.NewSourceFactory(storageClient))
if err != nil {
logFailure(importArgs, err)
return err
}
// Run the import.
importRunner, err := importer.NewImporter(importArgs.ImageImportRequest, computeClient, storageClient, toolLogger)
if err != nil {
logFailure(importArgs, err)
return err
}
importClosure := func() (service.Loggable, error) {
err := importRunner.Run(ctx)
return service.NewOutputInfoLoggable(toolLogger.ReadOutputInfo()), userFriendlyError(err, importArgs)
}
project := importArgs.Project
if err := service.RunWithServerLogging(
service.ImageImportAction, initLoggingParams(importArgs), &project, importClosure); err != nil {
return err
}
return nil
}