mirror of https://github.com/docker/docs.git
Merge pull request #206 from ryancox/master
Add support for 'notary status' command
This commit is contained in:
commit
a4048f543d
|
@ -326,6 +326,17 @@ func (r *NotaryRepository) GetTargetByName(name string) (*Target, error) {
|
||||||
return &Target{Name: name, Hashes: meta.Hashes, Length: meta.Length}, nil
|
return &Target{Name: name, Hashes: meta.Hashes, Length: meta.Length}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetChangelist returns the list of the repository's unpublished changes
|
||||||
|
func (r *NotaryRepository) GetChangelist() (changelist.Changelist, error) {
|
||||||
|
changelistDir := filepath.Join(r.tufRepoPath, "changelist")
|
||||||
|
cl, err := changelist.NewFileChangelist(changelistDir)
|
||||||
|
if err != nil {
|
||||||
|
logrus.Debug("Error initializing changelist")
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return cl, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Publish pushes the local changes in signed material to the remote notary-server
|
// Publish pushes the local changes in signed material to the remote notary-server
|
||||||
// Conceptually it performs an operation similar to a `git rebase`
|
// Conceptually it performs an operation similar to a `git rebase`
|
||||||
func (r *NotaryRepository) Publish() error {
|
func (r *NotaryRepository) Publish() error {
|
||||||
|
@ -371,11 +382,8 @@ func (r *NotaryRepository) Publish() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// load the changelist for this repo
|
cl, err := r.GetChangelist()
|
||||||
changelistDir := filepath.Join(r.tufRepoPath, "changelist")
|
|
||||||
cl, err := changelist.NewFileChangelist(changelistDir)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Debug("Error initializing changelist")
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// apply the changelist to the repo
|
// apply the changelist to the repo
|
||||||
|
@ -445,7 +453,7 @@ func (r *NotaryRepository) Publish() error {
|
||||||
// This is not a critical problem when only a single host is pushing
|
// This is not a critical problem when only a single host is pushing
|
||||||
// but will cause weird behaviour if changelist cleanup is failing
|
// but will cause weird behaviour if changelist cleanup is failing
|
||||||
// and there are multiple hosts writing to the repo.
|
// and there are multiple hosts writing to the repo.
|
||||||
logrus.Warn("Unable to clear changelist. You may want to manually delete the folder ", changelistDir)
|
logrus.Warn("Unable to clear changelist. You may want to manually delete the folder ", filepath.Join(r.tufRepoPath, "changelist"))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -564,6 +564,30 @@ func testPublish(t *testing.T, rootType data.KeyAlgorithm) {
|
||||||
|
|
||||||
changelistDir.Close()
|
changelistDir.Close()
|
||||||
|
|
||||||
|
// Test loading changelist
|
||||||
|
changes := make(map[string]changelist.Change)
|
||||||
|
cl, err := repo.GetChangelist()
|
||||||
|
assert.NoError(t, err, "could not get changelist for repo")
|
||||||
|
|
||||||
|
assert.Len(t, cl.List(), 2, "Wrong number of changes returned from changelist")
|
||||||
|
for _, ch := range cl.List() {
|
||||||
|
changes[ch.Path()] = ch
|
||||||
|
}
|
||||||
|
|
||||||
|
currentChange := changes["current"]
|
||||||
|
assert.NotNil(t, currentChange, "Expected changelist to contain a change for path 'current'")
|
||||||
|
assert.EqualValues(t, changelist.ActionCreate, currentChange.Action())
|
||||||
|
assert.Equal(t, "targets", currentChange.Scope())
|
||||||
|
assert.Equal(t, "target", currentChange.Type())
|
||||||
|
assert.Equal(t, "current", currentChange.Path())
|
||||||
|
|
||||||
|
latestChange := changes["latest"]
|
||||||
|
assert.NotNil(t, latestChange, "Expected changelist to contain a change for path 'latest'")
|
||||||
|
assert.EqualValues(t, changelist.ActionCreate, latestChange.Action())
|
||||||
|
assert.Equal(t, "targets", latestChange.Scope())
|
||||||
|
assert.Equal(t, "target", latestChange.Type())
|
||||||
|
assert.Equal(t, "latest", latestChange.Path())
|
||||||
|
|
||||||
// Now test Publish
|
// Now test Publish
|
||||||
err = repo.Publish()
|
err = repo.Publish()
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
|
@ -103,6 +103,7 @@ func main() {
|
||||||
cmdTufList.Flags().StringVarP(&remoteTrustServer, "server", "s", serverURL, "Remote trust server location")
|
cmdTufList.Flags().StringVarP(&remoteTrustServer, "server", "s", serverURL, "Remote trust server location")
|
||||||
notaryCmd.AddCommand(cmdTufAdd)
|
notaryCmd.AddCommand(cmdTufAdd)
|
||||||
notaryCmd.AddCommand(cmdTufRemove)
|
notaryCmd.AddCommand(cmdTufRemove)
|
||||||
|
notaryCmd.AddCommand(cmdTufStatus)
|
||||||
notaryCmd.AddCommand(cmdTufPublish)
|
notaryCmd.AddCommand(cmdTufPublish)
|
||||||
cmdTufPublish.Flags().StringVarP(&remoteTrustServer, "server", "s", serverURL, "Remote trust server location")
|
cmdTufPublish.Flags().StringVarP(&remoteTrustServer, "server", "s", serverURL, "Remote trust server location")
|
||||||
notaryCmd.AddCommand(cmdTufLookup)
|
notaryCmd.AddCommand(cmdTufLookup)
|
||||||
|
|
|
@ -66,6 +66,13 @@ var cmdTufPublish = &cobra.Command{
|
||||||
Run: tufPublish,
|
Run: tufPublish,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var cmdTufStatus = &cobra.Command{
|
||||||
|
Use: "status [ GUN ]",
|
||||||
|
Short: "displays status of unpublished changes to the local trusted collection.",
|
||||||
|
Long: "displays status of unpublished changes to the local trusted collection identified by the Globally Unique Name.",
|
||||||
|
Run: tufStatus,
|
||||||
|
}
|
||||||
|
|
||||||
var cmdVerify = &cobra.Command{
|
var cmdVerify = &cobra.Command{
|
||||||
Use: "verify [ GUN ] <target>",
|
Use: "verify [ GUN ] <target>",
|
||||||
Short: "verifies if the content is included in the trusted collection",
|
Short: "verifies if the content is included in the trusted collection",
|
||||||
|
@ -192,6 +199,38 @@ func tufLookup(cmd *cobra.Command, args []string) {
|
||||||
fmt.Println(target.Name, fmt.Sprintf("sha256:%x", target.Hashes["sha256"]), target.Length)
|
fmt.Println(target.Name, fmt.Sprintf("sha256:%x", target.Hashes["sha256"]), target.Length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func tufStatus(cmd *cobra.Command, args []string) {
|
||||||
|
if len(args) < 1 {
|
||||||
|
cmd.Usage()
|
||||||
|
fatalf("Must specify a GUN")
|
||||||
|
}
|
||||||
|
|
||||||
|
gun := args[0]
|
||||||
|
parseConfig()
|
||||||
|
|
||||||
|
nRepo, err := notaryclient.NewNotaryRepository(trustDir, gun, remoteTrustServer, nil, retriever)
|
||||||
|
if err != nil {
|
||||||
|
fatalf(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
cl, err := nRepo.GetChangelist()
|
||||||
|
if err != nil {
|
||||||
|
fatalf(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(cl.List()) == 0 {
|
||||||
|
fmt.Printf("No unpublished changes for %s\n", gun)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Unpublished changes for %s:\n\n", gun)
|
||||||
|
fmt.Printf("%-10s%-10s%-12s%s\n", "action", "scope", "type", "path")
|
||||||
|
fmt.Println("----------------------------------------------------")
|
||||||
|
for _, ch := range cl.List() {
|
||||||
|
fmt.Printf("%-10s%-10s%-12s%s\n", ch.Action(), ch.Scope(), ch.Type(), ch.Path())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func tufPublish(cmd *cobra.Command, args []string) {
|
func tufPublish(cmd *cobra.Command, args []string) {
|
||||||
if len(args) < 1 {
|
if len(args) < 1 {
|
||||||
cmd.Usage()
|
cmd.Usage()
|
||||||
|
|
Loading…
Reference in New Issue