Skip to content

Commit a2bfed5

Browse files
authored
Contract Update to allow deserialization of DockerReference (#163)
* Contract Update to allow deserialization of DockerReference * Updates To allow deserialization * remove Typed Component change
1 parent 1a4962a commit a2bfed5

3 files changed

Lines changed: 91 additions & 78 deletions

File tree

src/Microsoft.ComponentDetection.Common/DockerReference/DockerReferenceUtility.cs

Lines changed: 1 addition & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -169,59 +169,7 @@ public static DockerReference ParseAll(string name)
169169

170170
private static DockerReference CreateDockerReference(Reference options)
171171
{
172-
if (!string.IsNullOrEmpty(options.Repository) && string.IsNullOrEmpty(options.Domain))
173-
{
174-
if (!string.IsNullOrEmpty(options.Digest))
175-
{
176-
return new DigestReference
177-
{
178-
Digest = options.Digest,
179-
};
180-
}
181-
else
182-
{
183-
throw new ReferenceNameEmptyException(string.Empty);
184-
}
185-
}
186-
else if (string.IsNullOrEmpty(options.Tag))
187-
{
188-
if (string.IsNullOrEmpty(options.Digest))
189-
{
190-
return new CanonicalReference
191-
{
192-
Domain = options.Domain,
193-
Repository = options.Repository,
194-
Digest = options.Digest,
195-
};
196-
}
197-
else
198-
{
199-
return new RepositoryReference
200-
{
201-
Domain = options.Domain,
202-
Repository = options.Repository,
203-
};
204-
}
205-
}
206-
else if (string.IsNullOrEmpty(options.Digest))
207-
{
208-
return new TaggedReference
209-
{
210-
Domain = options.Domain,
211-
Repository = options.Repository,
212-
Tag = options.Tag,
213-
};
214-
}
215-
else
216-
{
217-
return new DualReference
218-
{
219-
Domain = options.Domain,
220-
Repository = options.Repository,
221-
Tag = options.Tag,
222-
Digest = options.Digest,
223-
};
224-
}
172+
return DockerReference.CreateDockerReference(options.Repository, options.Domain, options.Digest, options.Tag);
225173
}
226174
}
227175
}

src/Microsoft.ComponentDetection.Contracts/DockerReference.cs

Lines changed: 81 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,71 @@
11
namespace Microsoft.ComponentDetection.Contracts
22
{
33
#pragma warning disable SA1402
4-
public abstract class DockerReference
4+
public class DockerReference
55
{
6-
public abstract DockerReferenceKind Kind { get; }
6+
public virtual DockerReferenceKind Kind { get; }
77

8-
public abstract TypedComponent.DockerReferenceComponent ToTypedDockerReferenceComponent();
8+
public virtual TypedComponent.DockerReferenceComponent ToTypedDockerReferenceComponent()
9+
{
10+
throw new System.NotImplementedException();
11+
}
12+
13+
public static DockerReference CreateDockerReference(string repository, string domain, string digest, string tag)
14+
{
15+
if (!string.IsNullOrEmpty(repository) && string.IsNullOrEmpty(domain))
16+
{
17+
if (!string.IsNullOrEmpty(digest))
18+
{
19+
return new DigestReference
20+
{
21+
Digest = digest,
22+
};
23+
}
24+
else
25+
{
26+
throw new System.InvalidOperationException("Repository name must have at least one component");
27+
}
28+
}
29+
else if (string.IsNullOrEmpty(tag))
30+
{
31+
if (string.IsNullOrEmpty(digest))
32+
{
33+
return new CanonicalReference
34+
{
35+
Domain = domain,
36+
Repository = repository,
37+
Digest = digest,
38+
};
39+
}
40+
else
41+
{
42+
return new RepositoryReference
43+
{
44+
Domain = domain,
45+
Repository = repository,
46+
};
47+
}
48+
}
49+
else if (string.IsNullOrEmpty(digest))
50+
{
51+
return new TaggedReference
52+
{
53+
Domain = domain,
54+
Repository = repository,
55+
Tag = tag,
56+
};
57+
}
58+
else
59+
{
60+
return new DualReference
61+
{
62+
Domain = domain,
63+
Repository = repository,
64+
Tag = tag,
65+
Digest = digest,
66+
};
67+
}
68+
}
969
}
1070

1171
public enum DockerReferenceKind
@@ -20,19 +80,19 @@ public enum DockerReferenceKind
2080
public class Reference
2181
{
2282
public string Tag { get; set; }
23-
83+
2484
public string Digest { get; set; }
25-
85+
2686
public string Repository { get; set; }
27-
87+
2888
public string Domain { get; set; }
2989
}
3090

3191
// sha256:abc123...
3292
public class DigestReference : DockerReference
3393
{
3494
public override DockerReferenceKind Kind { get; } = DockerReferenceKind.Digest;
35-
95+
3696
public string Digest;
3797

3898
public override string ToString()
@@ -53,11 +113,11 @@ public override TypedComponent.DockerReferenceComponent ToTypedDockerReferenceCo
53113
public class CanonicalReference : DockerReference
54114
{
55115
public override DockerReferenceKind Kind { get; } = DockerReferenceKind.Canonical;
56-
116+
57117
public string Domain;
58-
118+
59119
public string Repository;
60-
120+
61121
public string Digest;
62122

63123
public override string ToString()
@@ -80,11 +140,11 @@ public override TypedComponent.DockerReferenceComponent ToTypedDockerReferenceCo
80140
public class RepositoryReference : DockerReference
81141
{
82142
public override DockerReferenceKind Kind { get; } = DockerReferenceKind.Repository;
83-
143+
84144
public string Domain;
85-
145+
86146
public string Repository;
87-
147+
88148
public override string ToString()
89149
{
90150
return $"{Repository}";
@@ -104,13 +164,13 @@ public override TypedComponent.DockerReferenceComponent ToTypedDockerReferenceCo
104164
public class TaggedReference : DockerReference
105165
{
106166
public override DockerReferenceKind Kind { get; } = DockerReferenceKind.Tagged;
107-
167+
108168
public string Domain;
109-
169+
110170
public string Repository;
111-
171+
112172
public string Tag;
113-
173+
114174
public override string ToString()
115175
{
116176
return $"{Domain}/{Repository}:${Tag}";
@@ -131,13 +191,13 @@ public override TypedComponent.DockerReferenceComponent ToTypedDockerReferenceCo
131191
public class DualReference : DockerReference
132192
{
133193
public override DockerReferenceKind Kind { get; } = DockerReferenceKind.Dual;
134-
194+
135195
public string Domain;
136-
196+
137197
public string Repository;
138-
198+
139199
public string Tag;
140-
200+
141201
public string Digest;
142202

143203
public override string ToString()

src/Microsoft.ComponentDetection.Contracts/TypedComponent/DockerReferenceComponent.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,11 @@ public DockerReferenceComponent(string hash, string name = null, string tag = nu
1212
Digest = ValidateRequiredInput(hash, nameof(Digest), nameof(ComponentType.DockerReference));
1313
Name = name;
1414
Tag = tag;
15-
}
15+
}
1616

1717
public DockerReferenceComponent(DockerReference reference)
1818
{
19-
FullReference = reference;
20-
}
19+
}
2120

2221
public string Name { get; set; }
2322

@@ -29,7 +28,13 @@ public DockerReferenceComponent(DockerReference reference)
2928

3029
public override ComponentType Type => ComponentType.DockerReference;
3130

32-
public DockerReference FullReference { get; set; }
31+
public DockerReference FullReference
32+
{
33+
get
34+
{
35+
return DockerReference.CreateDockerReference(Name, Domain, Digest, Tag);
36+
}
37+
}
3338

3439
public override string Id => $"{Name} {Tag} {Digest}";
3540
}

0 commit comments

Comments
 (0)