Skip to content

Commit

Permalink
refactor: dockerRepository
Browse files Browse the repository at this point in the history
  • Loading branch information
rarkins committed Feb 18, 2021
1 parent 15f4afc commit 586a83e
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 34 deletions.
71 changes: 38 additions & 33 deletions lib/datasource/docker/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ async function getECRAuthToken(

async function getAuthHeaders(
registry: string,
repository: string
dockerRepository: string
): Promise<OutgoingHttpHeaders | null> {
try {
const apiCheckUrl = `${registry}/v2/`;
Expand Down Expand Up @@ -164,15 +164,15 @@ async function getAuthHeaders(
delete opts.password;

if (authenticateHeader.scheme.toUpperCase() === 'BASIC') {
logger.debug(`Using Basic auth for docker registry ${repository}`);
logger.debug(`Using Basic auth for docker registry ${dockerRepository}`);
await http.get(apiCheckUrl, opts);
return opts.headers;
}

// prettier-ignore
const authUrl = `${String(authenticateHeader.parms.realm)}?service=${String(authenticateHeader.parms.service)}&scope=repository:${repository}:pull`;
const authUrl = `${String(authenticateHeader.parms.realm)}?service=${String(authenticateHeader.parms.service)}&scope=repository:${dockerRepository}:pull`;
logger.trace(
`Obtaining docker registry token for ${repository} using url ${authUrl}`
`Obtaining docker registry token for ${dockerRepository} using url ${authUrl}`
);
const authResponse = (
await http.getJson<{ token?: string; access_token?: string }>(
Expand All @@ -197,15 +197,15 @@ async function getAuthHeaders(
}
if (err.statusCode === 401) {
logger.debug(
{ registry, dockerRepository: repository },
{ registry, dockerRepository },
'Unauthorized docker lookup'
);
logger.debug({ err });
return null;
}
if (err.statusCode === 403) {
logger.debug(
{ registry, dockerRepository: repository },
{ registry, dockerRepository },
'Not allowed to access docker registry'
);
logger.debug({ err });
Expand All @@ -223,14 +223,11 @@ async function getAuthHeaders(
throw new ExternalHostError(err);
}
if (err.message === HOST_DISABLED) {
logger.trace(
{ registry, dockerRepository: repository, err },
'Host disabled'
);
logger.trace({ registry, dockerRepository, err }, 'Host disabled');
return null;
}
logger.warn(
{ registry, dockerRepository: repository, err },
{ registry, dockerRepository, err },
'Error obtaining docker token'
);
return null;
Expand All @@ -251,19 +248,19 @@ function extractDigestFromResponse(manifestResponse: HttpResponse): string {
// TODO: make generic to return json object
async function getManifestResponse(
registry: string,
repository: string,
dockerRepository: string,
tag: string
): Promise<HttpResponse> {
logger.debug(`getManifestResponse(${registry}, ${repository}, ${tag})`);
logger.debug(`getManifestResponse(${registry}, ${dockerRepository}, ${tag})`);
try {
const headers = await getAuthHeaders(registry, repository);
const headers = await getAuthHeaders(registry, dockerRepository);
if (!headers) {
logger.debug('No docker auth found - returning');
return null;
}
headers.accept =
'application/vnd.docker.distribution.manifest.list.v2+json, application/vnd.docker.distribution.manifest.v2+json';
const url = `${registry}/v2/${repository}/manifests/${tag}`;
const url = `${registry}/v2/${dockerRepository}/manifests/${tag}`;
const manifestResponse = await http.get(url, {
headers,
});
Expand All @@ -274,7 +271,7 @@ async function getManifestResponse(
}
if (err.statusCode === 401) {
logger.debug(
{ registry, dockerRepository: repository },
{ registry, dockerRepository },
'Unauthorized docker lookup'
);
logger.debug({ err });
Expand All @@ -285,7 +282,7 @@ async function getManifestResponse(
{
err,
registry,
dockerRepository: repository,
dockerRepository,
tag,
},
'Docker Manifest is unknown'
Expand All @@ -311,7 +308,7 @@ async function getManifestResponse(
{
err,
registry,
dockerRepository: repository,
dockerRepository,
tag,
},
'Unknown Error looking up docker manifest'
Expand All @@ -322,10 +319,14 @@ async function getManifestResponse(

async function getConfigDigest(
registry: string,
repository: string,
dockerRepository: string,
tag: string
): Promise<string> {
const manifestResponse = await getManifestResponse(registry, repository, tag);
const manifestResponse = await getManifestResponse(
registry,
dockerRepository,
tag
);
// If getting the manifest fails here, then abort
// This means that the latest tag doesn't have a manifest, which shouldn't
// be possible
Expand All @@ -336,18 +337,22 @@ async function getConfigDigest(
const manifest = JSON.parse(manifestResponse.body) as ImageList | Image;
if (manifest.schemaVersion !== 2) {
logger.debug(
{ registry, dockerRepository: repository, tag },
{ registry, dockerRepository, tag },
'Manifest schema version is not 2'
);
return null;
}

if (manifest.mediaType === MediaType.manifestListV2) {
logger.trace(
{ registry, dockerRepository: repository, tag },
{ registry, dockerRepository, tag },
'Found manifest list, using first image'
);
return getConfigDigest(registry, repository, manifest.manifests[0].digest);
return getConfigDigest(
registry,
dockerRepository,
manifest.manifests[0].digest
);
}

if (manifest.mediaType === MediaType.manifestV2) {
Expand Down Expand Up @@ -498,12 +503,12 @@ async function getTags(

async function getLabels(
registry: string,
repository: string,
dockerRepository: string,
tag: string
): Promise<Record<string, string>> {
logger.debug(`getLabels(${registry}, ${repository}, ${tag})`);
logger.debug(`getLabels(${registry}, ${dockerRepository}, ${tag})`);
const cacheNamespace = 'datasource-docker-labels';
const cacheKey = `${registry}:${repository}:${tag}`;
const cacheKey = `${registry}:${dockerRepository}:${tag}`;
const cachedResult = await packageCache.get<Record<string, string>>(
cacheNamespace,
cacheKey
Expand All @@ -514,18 +519,18 @@ async function getLabels(
}
try {
let labels: Record<string, string> = {};
const configDigest = await getConfigDigest(registry, repository, tag);
const configDigest = await getConfigDigest(registry, dockerRepository, tag);
if (!configDigest) {
return {};
}

const headers = await getAuthHeaders(registry, repository);
const headers = await getAuthHeaders(registry, dockerRepository);
// istanbul ignore if: Should never be happen
if (!headers) {
logger.debug('No docker auth found - returning');
return {};
}
const url = `${registry}/v2/${repository}/blobs/${configDigest}`;
const url = `${registry}/v2/${dockerRepository}/blobs/${configDigest}`;
const configResponse = await http.get(url, {
headers,
});
Expand All @@ -548,15 +553,15 @@ async function getLabels(
}
if (err.statusCode === 400 || err.statusCode === 401) {
logger.debug(
{ registry, dockerRepository: repository, err },
{ registry, dockerRepository, err },
'Unauthorized docker lookup'
);
} else if (err.statusCode === 404) {
logger.warn(
{
err,
registry,
dockerRepository: repository,
dockerRepository,
tag,
},
'Config Manifest is unknown'
Expand All @@ -571,7 +576,7 @@ async function getLabels(
{
err,
registry,
dockerRepository: repository,
dockerRepository,
tag,
},
'docker registry failure: internal error'
Expand All @@ -588,7 +593,7 @@ async function getLabels(
);
} else {
logger.info(
{ registry, dockerRepository: repository, tag, err },
{ registry, dockerRepository, tag, err },
'Unknown error getting Docker labels'
);
}
Expand Down
1 change: 0 additions & 1 deletion lib/manager/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,6 @@ export interface Upgrade<T = Record<string, any>>
isLockfileUpdate?: boolean;
currentRawValue?: any;
depGroup?: string;
dockerRepository?: string;
localDir?: string;
name?: string;
newDigest?: string;
Expand Down

0 comments on commit 586a83e

Please sign in to comment.