forked from knative/client
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implements Kn plugins re-using some code from kubectl plugins. (knati…
…ve#249) This version contains the following: 1. wraps the main root Kn command to support plugin 2. plugins are any executable in kn's config new pluginDir variable which defaults to $PATH 3. plugins must have name kn-* 4. 'kn plugin list' sub-command to list found kn plugins 5. skips any kn plugins found with name that match core commands, e.g., kn-service would be ignored 6. can execute any valid kn plugins found, e.g., `kn valid` where the plugin file `kn-valid` is in path specified in 2. 7. unit tests (using gotest.tools) And is missing: 1. integration tests 2. plugin install command 3. plugin repository command 4. plugin / Knative server version negotiation 5. anything else we agree on in plugin req doc I plan to create issues for the things missing so we don't end up with an even bigger PR. It's already big as is but is a good MVP as per plugins requirement doc.
- Loading branch information
1 parent
df816e6
commit 3310809
Showing
36 changed files
with
1,804 additions
and
44 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
## kn plugin | ||
|
||
Plugin command group | ||
|
||
### Synopsis | ||
|
||
Provides utilities for interacting and managing with kn plugins. | ||
|
||
Plugins provide extended functionality that is not part of the core kn command-line distribution. | ||
Please refer to the documentation and examples for more information about how write your own plugins. | ||
|
||
``` | ||
kn plugin [flags] | ||
``` | ||
|
||
### Options | ||
|
||
``` | ||
-h, --help help for plugin | ||
--lookup-plugins-in-path look for kn plugins in $PATH | ||
--plugins-dir string kn plugins directory (default "~/.kn/plugins") | ||
``` | ||
|
||
### Options inherited from parent commands | ||
|
||
``` | ||
--config string kn config file (default is $HOME/.kn/config.yaml) | ||
--kubeconfig string kubectl config file (default is $HOME/.kube/config) | ||
``` | ||
|
||
### SEE ALSO | ||
|
||
* [kn](kn.md) - Knative client | ||
* [kn plugin list](kn_plugin_list.md) - List all visible plugin executables | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
## kn plugin list | ||
|
||
List all visible plugin executables | ||
|
||
### Synopsis | ||
|
||
List all visible plugin executables. | ||
|
||
Available plugin files are those that are: | ||
- executable | ||
- begin with "kn- | ||
- anywhere on the path specified in Kn's config pluginDir variable, which: | ||
* can be overridden with the --plugin-dir flag | ||
|
||
``` | ||
kn plugin list [flags] | ||
``` | ||
|
||
### Options | ||
|
||
``` | ||
-h, --help help for list | ||
--lookup-plugins-in-path look for kn plugins in $PATH | ||
--name-only If true, display only the binary name of each plugin, rather than its full path | ||
--plugins-dir string kn plugins directory (default "~/.kn/plugins") | ||
``` | ||
|
||
### Options inherited from parent commands | ||
|
||
``` | ||
--config string kn config file (default is $HOME/.kn/config.yaml) | ||
--kubeconfig string kubectl config file (default is $HOME/.kube/config) | ||
``` | ||
|
||
### SEE ALSO | ||
|
||
* [kn plugin](kn_plugin.md) - Plugin command group | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
// Copyright © 2018 The Knative Authors | ||
// | ||
// Licensed under the Apache License, Version 2.0 (the "License"); | ||
// you may not use this file except in compliance with the License. | ||
// You may obtain a copy of the License at | ||
// | ||
// http://www.apache.org/licenses/LICENSE-2.0 | ||
// | ||
// Unless required by applicable law or agreed to in writing, software | ||
// distributed under the License is distributed on an "AS IS" BASIS, | ||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
// See the License for the specific language governing permissions and | ||
// limitations under the License. | ||
|
||
package plugin | ||
|
||
import ( | ||
"fmt" | ||
"os" | ||
"path/filepath" | ||
"runtime" | ||
"strings" | ||
|
||
"github.com/spf13/cobra" | ||
) | ||
|
||
// PathVerifier receives a path and determines if it is valid or not | ||
type PathVerifier interface { | ||
// Verify determines if a given path is valid | ||
Verify(path string) []error | ||
} | ||
|
||
// CommandOverrideVerifier verifies that existing kn commands are not overriden | ||
type CommandOverrideVerifier struct { | ||
Root *cobra.Command | ||
SeenPlugins map[string]string | ||
} | ||
|
||
// Verify implements PathVerifier and determines if a given path | ||
// is valid depending on whether or not it overwrites an existing | ||
// kn command path, or a previously seen plugin. | ||
func (v *CommandOverrideVerifier) Verify(path string) []error { | ||
if v.Root == nil { | ||
return []error{fmt.Errorf("unable to verify path with nil root")} | ||
} | ||
|
||
// extract the plugin binary name | ||
segs := strings.Split(path, string(os.PathSeparator)) | ||
binName := segs[len(segs)-1] | ||
|
||
cmdPath := strings.Split(binName, "-") | ||
if len(cmdPath) > 1 { | ||
// the first argument is always "kn" for a plugin binary | ||
cmdPath = cmdPath[1:] | ||
} | ||
|
||
errors := []error{} | ||
isExec, err := isExecutable(path) | ||
if err == nil && !isExec { | ||
errors = append(errors, fmt.Errorf("warning: %s identified as a kn plugin, but it is not executable", path)) | ||
} else if err != nil { | ||
errors = append(errors, fmt.Errorf("error: unable to identify %s as an executable file: %v", path, err)) | ||
} | ||
|
||
if existingPath, ok := v.SeenPlugins[binName]; ok { | ||
errors = append(errors, fmt.Errorf("warning: %s is overshadowed by a similarly named plugin: %s", path, existingPath)) | ||
} else { | ||
v.SeenPlugins[binName] = path | ||
} | ||
|
||
cmd, _, err := v.Root.Find(cmdPath) | ||
if err == nil { | ||
errors = append(errors, fmt.Errorf("warning: %s overwrites existing command: %q", binName, cmd.CommandPath())) | ||
} | ||
|
||
return errors | ||
} | ||
|
||
// Private functions | ||
|
||
func isExecutable(fullPath string) (bool, error) { | ||
info, err := os.Stat(fullPath) | ||
if err != nil { | ||
return false, err | ||
} | ||
|
||
if runtime.GOOS == "windows" { | ||
fileExt := strings.ToLower(filepath.Ext(fullPath)) | ||
|
||
switch fileExt { | ||
case ".bat", ".cmd", ".com", ".exe", ".ps1": | ||
return true, nil | ||
} | ||
return false, nil | ||
} | ||
|
||
if m := info.Mode(); !m.IsDir() && m&0111 != 0 { | ||
return true, nil | ||
} | ||
|
||
return false, nil | ||
} |
Oops, something went wrong.