mirror of https://github.com/docker/docs.git
				
				
				
			Add test for, and fix bug with, publishing a bare repo not sending the targets file.
It should always be published the first time, like the root.json. Signed-off-by: Ying Li <ying.li@docker.com>
This commit is contained in:
		
							parent
							
								
									c12958af36
								
							
						
					
					
						commit
						a1cbe5d43c
					
				|  | @ -522,7 +522,7 @@ func (r *NotaryRepository) GetChangelist() (changelist.Changelist, error) { | |||
| // Publish pushes the local changes in signed material to the remote notary-server
 | ||||
| // Conceptually it performs an operation similar to a `git rebase`
 | ||||
| func (r *NotaryRepository) Publish() error { | ||||
| 	var updateRoot bool | ||||
| 	var initialPublish bool | ||||
| 	// attempt to initialize the repo from the remote store
 | ||||
| 	c, err := r.bootstrapClient() | ||||
| 	if err != nil { | ||||
|  | @ -538,10 +538,11 @@ func (r *NotaryRepository) Publish() error { | |||
| 				return err | ||||
| 			} | ||||
| 			// We had local data but the server doesn't know about the repo yet,
 | ||||
| 			// ensure we will push the initial root file.  The root may not
 | ||||
| 			// be marked as Dirty, since there may not be any changes that
 | ||||
| 			// update it, so use a different boolean.
 | ||||
| 			updateRoot = true | ||||
| 			// ensure we will push the initial root and targets file.  Either or
 | ||||
| 			// both of the root and targets may not be marked as Dirty, since
 | ||||
| 			// there may not be any changes that update them, so use a
 | ||||
| 			// different boolean.
 | ||||
| 			initialPublish = true | ||||
| 		} else { | ||||
| 			// The remote store returned an error other than 404. We're
 | ||||
| 			// unable to determine if the repo has been initialized or not.
 | ||||
|  | @ -576,7 +577,7 @@ func (r *NotaryRepository) Publish() error { | |||
| 	updatedFiles := make(map[string][]byte) | ||||
| 
 | ||||
| 	// check if our root file is nearing expiry. Resign if it is.
 | ||||
| 	if nearExpiry(r.tufRepo.Root) || r.tufRepo.Root.Dirty || updateRoot { | ||||
| 	if nearExpiry(r.tufRepo.Root) || r.tufRepo.Root.Dirty || initialPublish { | ||||
| 		rootJSON, err := serializeCanonicalRole(r.tufRepo, data.CanonicalRootRole) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
|  | @ -586,7 +587,7 @@ func (r *NotaryRepository) Publish() error { | |||
| 
 | ||||
| 	// iterate through all the targets files - if they are dirty, sign and update
 | ||||
| 	for roleName, roleObj := range r.tufRepo.Targets { | ||||
| 		if roleObj.Dirty { | ||||
| 		if roleObj.Dirty || (roleName == data.CanonicalTargetsRole && initialPublish) { | ||||
| 			targetsJSON, err := serializeCanonicalRole(r.tufRepo, roleName) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
|  |  | |||
|  | @ -1140,28 +1140,74 @@ func testGetChangelist(t *testing.T, rootType string) { | |||
| 	assert.Equal(t, "latest", latestChange.Path()) | ||||
| } | ||||
| 
 | ||||
| // Create a repo, instantiate a notary server, and publish the repo to the
 | ||||
| // server, signing all the non-timestamp metadata.
 | ||||
| // Create a repo, instantiate a notary server, and publish the bare repo to the
 | ||||
| // server, signing all the non-timestamp metadata.  Root, targets, and snapshots
 | ||||
| // (if locally signing) should be sent.
 | ||||
| func TestPublishBareRepo(t *testing.T) { | ||||
| 	testPublishNoData(t, data.ECDSAKey, true) | ||||
| 	testPublishNoData(t, data.ECDSAKey, false) | ||||
| 	if !testing.Short() { | ||||
| 		testPublishNoData(t, data.RSAKey, true) | ||||
| 		testPublishNoData(t, data.RSAKey, false) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func testPublishNoData(t *testing.T, rootType string, serverManagesSnapshot bool) { | ||||
| 	var tempDirs [2]string | ||||
| 	for i := 0; i < 2; i++ { | ||||
| 		tempBaseDir, err := ioutil.TempDir("", "notary-test-") | ||||
| 		assert.NoError(t, err, "failed to create a temporary directory: %s", err) | ||||
| 		defer os.RemoveAll(tempBaseDir) | ||||
| 		tempDirs[i] = tempBaseDir | ||||
| 	} | ||||
| 
 | ||||
| 	gun := "docker.com/notary" | ||||
| 	ts := fullTestServer(t) | ||||
| 	defer ts.Close() | ||||
| 
 | ||||
| 	repo1, _ := initializeRepo(t, rootType, tempDirs[0], gun, ts.URL, | ||||
| 		serverManagesSnapshot) | ||||
| 	assert.NoError(t, repo1.Publish()) | ||||
| 
 | ||||
| 	// use another repo to check metadata
 | ||||
| 	repo2, err := NewNotaryRepository(tempDirs[1], gun, ts.URL, | ||||
| 		http.DefaultTransport, passphraseRetriever) | ||||
| 	assert.NoError(t, err, "error creating repository: %s", err) | ||||
| 
 | ||||
| 	targets, err := repo2.ListTargets() | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Empty(t, targets) | ||||
| 
 | ||||
| 	for role := range data.ValidRoles { | ||||
| 		// we don't cache timstamp metadata
 | ||||
| 		if role != data.CanonicalTimestampRole { | ||||
| 			assertRepoHasExpectedMetadata(t, repo2, role, true) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Create a repo, instantiate a notary server, and publish the repo with
 | ||||
| // some targets to the server, signing all the non-timestamp metadata.
 | ||||
| // We test this with both an RSA and ECDSA root key
 | ||||
| func TestPublishClientHasSnapshotKey(t *testing.T) { | ||||
| 	testPublish(t, data.ECDSAKey, false) | ||||
| 	testPublishWithData(t, data.ECDSAKey, false) | ||||
| 	if !testing.Short() { | ||||
| 		testPublish(t, data.RSAKey, false) | ||||
| 		testPublishWithData(t, data.RSAKey, false) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Create a repo, instantiate a notary server (designating the server as the
 | ||||
| // snapshot signer) , and publish the repo to the server, signing the root and
 | ||||
| // targets metadata only.  The server should sign just fine.
 | ||||
| // snapshot signer) , and publish the repo with some targets to the server,
 | ||||
| // signing the root and targets metadata only.  The server should sign just fine.
 | ||||
| // We test this with both an RSA and ECDSA root key
 | ||||
| func TestPublishAfterInitServerHasSnapshotKey(t *testing.T) { | ||||
| 	testPublish(t, data.ECDSAKey, true) | ||||
| 	testPublishWithData(t, data.ECDSAKey, true) | ||||
| 	if !testing.Short() { | ||||
| 		testPublish(t, data.RSAKey, true) | ||||
| 		testPublishWithData(t, data.RSAKey, true) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func testPublish(t *testing.T, rootType string, serverManagesSnapshot bool) { | ||||
| func testPublishWithData(t *testing.T, rootType string, serverManagesSnapshot bool) { | ||||
| 	// Temporary directory where test files will be created
 | ||||
| 	tempBaseDir, err := ioutil.TempDir("/tmp", "notary-test-") | ||||
| 	defer os.RemoveAll(tempBaseDir) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue