mirror of https://github.com/docker/docs.git
delegations CLI UX improvements
Signed-off-by: Riyaz Faizullabhoy <riyaz.faizullabhoy@docker.com>
This commit is contained in:
parent
ffe603a968
commit
774b66c9fe
|
|
@ -32,9 +32,9 @@ var cmdDelegationRemoveTemplate = usageTemplate{
|
|||
}
|
||||
|
||||
var cmdDelegationAddTemplate = usageTemplate{
|
||||
Use: "add [ GUN ] [ Role ] <PEM file path 1> ...",
|
||||
Short: "Add a keys to delegation using the provided public key certificate PEMs.",
|
||||
Long: "Add a keys to delegation using the provided public key certificate PEMs in a specific Global Unique Name.",
|
||||
Use: "add [ GUN ] [ Role ] <X509 file path 1> ...",
|
||||
Short: "Add a keys to delegation using the provided public key X509 certificates.",
|
||||
Long: "Add a keys to delegation using the provided public key PEM encoded X509 certificates in a specific Global Unique Name.",
|
||||
}
|
||||
|
||||
var paths []string
|
||||
|
|
@ -84,7 +84,7 @@ func (d *delegationCommander) delegationsList(cmd *cobra.Command, args []string)
|
|||
}
|
||||
|
||||
cmd.Println("")
|
||||
prettyPrintRoles(delegationRoles, cmd.Out())
|
||||
prettyPrintRoles(delegationRoles, cmd.Out(), "delegations")
|
||||
cmd.Println("")
|
||||
return nil
|
||||
}
|
||||
|
|
@ -100,6 +100,11 @@ func (d *delegationCommander) delegationRemove(cmd *cobra.Command, args []string
|
|||
gun := args[0]
|
||||
role := args[1]
|
||||
|
||||
// Check if role is valid delegation name before requiring any user input
|
||||
if !data.IsDelegation(role) {
|
||||
return fmt.Errorf("invalid delegation name %s", role)
|
||||
}
|
||||
|
||||
// If we're only given the gun and the role, attempt to remove all data for this delegation
|
||||
if len(args) == 2 && paths == nil {
|
||||
removeAll = true
|
||||
|
|
@ -143,10 +148,11 @@ func (d *delegationCommander) delegationRemove(cmd *cobra.Command, args []string
|
|||
cmd.Println("")
|
||||
if removeAll {
|
||||
cmd.Printf("Forced removal (including all keys and paths) of delegation role %s to repository \"%s\" staged for next publish.\n", role, gun)
|
||||
} else {
|
||||
cmd.Printf(
|
||||
"Removal of delegation role %s with keys %s and paths %s, to repository \"%s\" staged for next publish.\n",
|
||||
role, keyIDs, paths, gun)
|
||||
}
|
||||
cmd.Printf(
|
||||
"Removal of delegation role %s with keys %s and paths %s, to repository \"%s\" staged for next publish.\n",
|
||||
role, keyIDs, paths, gun)
|
||||
cmd.Println("")
|
||||
|
||||
return nil
|
||||
|
|
|
|||
|
|
@ -80,6 +80,18 @@ func TestRemoveInvalidDelegationName(t *testing.T) {
|
|||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
func TestRemoveAllInvalidDelegationName(t *testing.T) {
|
||||
// Cleanup after test
|
||||
defer os.RemoveAll(testTrustDir)
|
||||
|
||||
// Setup commander
|
||||
commander := setup()
|
||||
|
||||
// Should error due to invalid delegation name (should be prefixed by "targets/")
|
||||
err := commander.delegationRemove(commander.GetCommand(), []string{"gun", "INVALID_NAME"})
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
func TestAddInvalidNumArgs(t *testing.T) {
|
||||
// Setup commander
|
||||
commander := setup()
|
||||
|
|
|
|||
|
|
@ -189,7 +189,7 @@ func TestClientDelegationsInteraction(t *testing.T) {
|
|||
// list delegations - none yet
|
||||
output, err = runCommand(t, tempDir, "-s", server.URL, "delegation", "list", "gun")
|
||||
assert.NoError(t, err)
|
||||
assert.Contains(t, output, "No such roles published in this repository.")
|
||||
assert.Contains(t, output, "No delegations present in this repository.")
|
||||
|
||||
// add new valid delegation with single new cert
|
||||
output, err = runCommand(t, tempDir, "delegation", "add", "gun", "targets/delegation", tempFile.Name())
|
||||
|
|
@ -204,7 +204,7 @@ func TestClientDelegationsInteraction(t *testing.T) {
|
|||
// list delegations - none yet because still unpublished
|
||||
output, err = runCommand(t, tempDir, "-s", server.URL, "delegation", "list", "gun")
|
||||
assert.NoError(t, err)
|
||||
assert.Contains(t, output, "No such roles published in this repository.")
|
||||
assert.Contains(t, output, "No delegations present in this repository.")
|
||||
|
||||
// publish repo
|
||||
_, err = runCommand(t, tempDir, "-s", server.URL, "publish", "gun")
|
||||
|
|
@ -281,7 +281,7 @@ func TestClientDelegationsInteraction(t *testing.T) {
|
|||
// list delegations - we should see no delegations
|
||||
output, err = runCommand(t, tempDir, "-s", server.URL, "delegation", "list", "gun")
|
||||
assert.NoError(t, err)
|
||||
assert.Contains(t, output, "No such roles published in this repository.")
|
||||
assert.Contains(t, output, "No delegations present in this repository.")
|
||||
|
||||
// add delegation with multiple certs and multiple paths
|
||||
output, err = runCommand(t, tempDir, "delegation", "add", "gun", "targets/delegation", tempFile.Name(), tempFile2.Name(), "--paths", "path1,path2")
|
||||
|
|
@ -350,7 +350,7 @@ func TestClientDelegationsInteraction(t *testing.T) {
|
|||
// remove by force to delete the delegation entirely
|
||||
output, err = runCommand(t, tempDir, "delegation", "remove", "gun", "targets/delegation", "-y")
|
||||
assert.NoError(t, err)
|
||||
assert.Contains(t, output, "Removal of delegation role")
|
||||
assert.Contains(t, output, "Forced removal (including all keys and paths) of delegation role")
|
||||
|
||||
// publish repo
|
||||
_, err = runCommand(t, tempDir, "-s", server.URL, "publish", "gun")
|
||||
|
|
@ -359,7 +359,7 @@ func TestClientDelegationsInteraction(t *testing.T) {
|
|||
// list delegations - we should see no delegations
|
||||
output, err = runCommand(t, tempDir, "-s", server.URL, "delegation", "list", "gun")
|
||||
assert.NoError(t, err)
|
||||
assert.Contains(t, output, "No such roles published in this repository.")
|
||||
assert.Contains(t, output, "No delegations present in this repository.")
|
||||
}
|
||||
|
||||
// Splits a string into lines, and returns any lines that are not empty (
|
||||
|
|
|
|||
|
|
@ -176,9 +176,9 @@ func prettyPrintTargets(ts []*client.TargetWithRole, writer io.Writer) {
|
|||
}
|
||||
|
||||
// Pretty-prints the list of provided Roles
|
||||
func prettyPrintRoles(rs []*data.Role, writer io.Writer) {
|
||||
func prettyPrintRoles(rs []*data.Role, writer io.Writer, roleType string) {
|
||||
if len(rs) == 0 {
|
||||
writer.Write([]byte("\nNo such roles published in this repository.\n\n"))
|
||||
writer.Write([]byte(fmt.Sprintf("\nNo %s present in this repository.\n\n", roleType)))
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -220,13 +220,13 @@ func generateCertificate(t *testing.T, gun string, expireInHours int64) *x509.Ce
|
|||
// are no roles.
|
||||
func TestPrettyPrintZeroRoles(t *testing.T) {
|
||||
var b bytes.Buffer
|
||||
prettyPrintRoles([]*data.Role{}, &b)
|
||||
prettyPrintRoles([]*data.Role{}, &b, "delegations")
|
||||
text, err := ioutil.ReadAll(&b)
|
||||
assert.NoError(t, err)
|
||||
|
||||
lines := strings.Split(strings.TrimSpace(string(text)), "\n")
|
||||
assert.Len(t, lines, 1)
|
||||
assert.Equal(t, "No such roles published in this repository.", lines[0])
|
||||
assert.Equal(t, "No delegations present in this repository.", lines[0])
|
||||
}
|
||||
|
||||
// Roles are sorted by name, and the name, paths, and KeyIDs are printed.
|
||||
|
|
@ -241,7 +241,7 @@ func TestPrettyPrintSortedRoles(t *testing.T) {
|
|||
}
|
||||
|
||||
var b bytes.Buffer
|
||||
prettyPrintRoles(unsorted, &b)
|
||||
prettyPrintRoles(unsorted, &b, "delegations")
|
||||
text, err := ioutil.ReadAll(&b)
|
||||
assert.NoError(t, err)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue