// Copyright (c) 2018-2019, Sylabs Inc. All rights reserved. // This software is licensed under a 3-clause BSD license. Please consult the // LICENSE.md file distributed with the sources of this project regarding your // rights to use or distribute this software. package cli import ( "context" "github.com/spf13/cobra" "github.com/sylabs/scs-library-client/client" "github.com/sylabs/singularity/docs" "github.com/sylabs/singularity/internal/pkg/library" scs "github.com/sylabs/singularity/internal/pkg/remote" "github.com/sylabs/singularity/internal/pkg/sylog" "github.com/sylabs/singularity/pkg/cmdline" ) var ( // SearchLibraryURI holds the base URI to a Sylabs library API instance SearchLibraryURI string ) // --library var searchLibraryFlag = cmdline.Flag{ ID: "searchLibraryFlag", Value: &SearchLibraryURI, DefaultValue: "https://library.sylabs.io", Name: "library", Usage: "URI for library to search", EnvKeys: []string{"LIBRARY"}, } func init() { cmdManager.RegisterCmd(SearchCmd) cmdManager.RegisterFlagForCmd(&searchLibraryFlag, SearchCmd) } // SearchCmd singularity search var SearchCmd = &cobra.Command{ DisableFlagsInUseLine: true, Args: cobra.ExactArgs(1), PreRun: sylabsToken, Run: func(cmd *cobra.Command, args []string) { handleSearchFlags(cmd) libraryClient, err := client.NewClient(&client.Config{ BaseURL: SearchLibraryURI, AuthToken: authToken, }) if err != nil { sylog.Fatalf("Error initializing library client: %v", err) } if err := library.SearchLibrary(context.TODO(), libraryClient, args[0]); err != nil { sylog.Fatalf("Couldn't search library: %v", err) } }, Use: docs.SearchUse, Short: docs.SearchShort, Long: docs.SearchLong, Example: docs.SearchExample, } func handleSearchFlags(cmd *cobra.Command) { // if we can load config and if default endpoint is set, use that // otherwise fall back on regular authtoken and URI behavior endpoint, err := sylabsRemote(remoteConfig) if err == scs.ErrNoDefault { sylog.Warningf("No default remote in use, falling back to: %v", SearchLibraryURI) return } else if err != nil { sylog.Fatalf("Unable to load remote configuration: %v", err) } authToken = endpoint.Token if !cmd.Flags().Lookup("library").Changed { uri, err := endpoint.GetServiceURI("library") if err != nil { sylog.Fatalf("Unable to get library URI: %v", err) } SearchLibraryURI = uri } }