func Main()

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
}