-
Notifications
You must be signed in to change notification settings - Fork 263
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.
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
2ae037f
commit 179a9d3
Showing
31 changed files
with
1,022 additions
and
8 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
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,34 @@ | ||
## kn plugin | ||
|
||
Plugin command group | ||
|
||
### Synopsis | ||
|
||
Provides utilities for interacting with kn plugins. | ||
|
||
Plugins provide extended functionality that is not part of the major 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 | ||
``` | ||
|
||
### Options inherited from parent commands | ||
|
||
``` | ||
--config string config file (default is $HOME/.kn/config.yaml) | ||
--kubeconfig string kubectl config file (default is $HOME/.kube/config) | ||
--plugin-dir string kn plugin directory (default is value in kn config or $PATH) | ||
``` | ||
|
||
### SEE ALSO | ||
|
||
* [kn](kn.md) - Knative client | ||
* [kn plugin list](kn_plugin_list.md) - List all visible plugin executables on a user's PATH | ||
|
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,36 @@ | ||
## kn plugin list | ||
|
||
List all visible plugin executables on a user's PATH | ||
|
||
### Synopsis | ||
|
||
List all visible plugin executables on a user's PATH. | ||
|
||
Available plugin files are those that are: | ||
- executable | ||
- anywhere on the user's PATH | ||
- begin with "kn- | ||
|
||
``` | ||
kn plugin list [flags] | ||
``` | ||
|
||
### Options | ||
|
||
``` | ||
-h, --help help for list | ||
--name-only If true, display only the binary name of each plugin, rather than its full path | ||
``` | ||
|
||
### Options inherited from parent commands | ||
|
||
``` | ||
--config string config file (default is $HOME/.kn/config.yaml) | ||
--kubeconfig string kubectl config file (default is $HOME/.kube/config) | ||
--plugin-dir string kn plugin directory (default is value in kn config or $PATH) | ||
``` | ||
|
||
### 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
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, "/") | ||
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.