Skip to content

Commit 4f72a6d

Browse files
Merge pull request #16293 from mfojtik/signature-controller
Automatic merge from submit-queue (batch tested with PRs 16293, 16455) Controller for automatic image signature import This controller watches all images and automatically imports the image signatures using `container/image` library. * Sync never remove/override existing imported signatures * This needs a config file in `/etc/containers/registry.d` to work properly cc @bparees
2 parents ec2145b + 8940bb3 commit 4f72a6d

File tree

165 files changed

+10984
-503
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

165 files changed

+10984
-503
lines changed

Godeps/Godeps.json

Lines changed: 20 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/cmd/server/origin/controller/config.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,9 @@ type OpenshiftControllerConfig struct {
4848
DeploymentConfigControllerConfig DeploymentConfigControllerConfig
4949
DeploymentTriggerControllerConfig DeploymentTriggerControllerConfig
5050

51-
ImageTriggerControllerConfig ImageTriggerControllerConfig
52-
ImageImportControllerConfig ImageImportControllerConfig
51+
ImageTriggerControllerConfig ImageTriggerControllerConfig
52+
ImageSignatureImportControllerConfig ImageSignatureImportControllerConfig
53+
ImageImportControllerConfig ImageImportControllerConfig
5354

5455
ServiceServingCertsControllerOptions ServiceServingCertsControllerOptions
5556

@@ -80,6 +81,7 @@ func (c *OpenshiftControllerConfig) GetControllerInitializers() (map[string]Init
8081

8182
ret["openshift.io/image-trigger"] = c.ImageTriggerControllerConfig.RunController
8283
ret["openshift.io/image-import"] = c.ImageImportControllerConfig.RunController
84+
ret["openshift.io/image-signature-import"] = c.ImageSignatureImportControllerConfig.RunController
8385

8486
ret["openshift.io/templateinstance"] = RunTemplateInstanceController
8587

@@ -203,6 +205,11 @@ func BuildOpenshiftControllerConfig(options configapi.MasterConfig) (*OpenshiftC
203205
DisableScheduledImport: options.ImagePolicyConfig.DisableScheduledImport,
204206
ScheduledImageImportMinimumIntervalSeconds: options.ImagePolicyConfig.ScheduledImageImportMinimumIntervalSeconds,
205207
}
208+
ret.ImageSignatureImportControllerConfig = ImageSignatureImportControllerConfig{
209+
ResyncPeriod: 10 * time.Minute,
210+
SignatureFetchTimeout: 1 * time.Minute,
211+
SignatureImportLimit: 3,
212+
}
206213

207214
ret.ServiceServingCertsControllerOptions = ServiceServingCertsControllerOptions{
208215
Signer: options.ControllerConfig.ServiceServingCert.Signer,

pkg/cmd/server/origin/controller/image.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package controller
22

33
import (
4+
"context"
45
"fmt"
56
"time"
67

@@ -18,6 +19,7 @@ import (
1819
buildclient "github.com/openshift/origin/pkg/build/client"
1920
"github.com/openshift/origin/pkg/cmd/server/bootstrappolicy"
2021
imagecontroller "github.com/openshift/origin/pkg/image/controller"
22+
imagesignaturecontroller "github.com/openshift/origin/pkg/image/controller/signature"
2123
imagetriggercontroller "github.com/openshift/origin/pkg/image/controller/trigger"
2224
triggerannotations "github.com/openshift/origin/pkg/image/trigger/annotations"
2325
triggerbuildconfigs "github.com/openshift/origin/pkg/image/trigger/buildconfigs"
@@ -147,6 +149,25 @@ func (u podSpecUpdater) Update(obj runtime.Object) error {
147149
}
148150
}
149151

152+
type ImageSignatureImportControllerConfig struct {
153+
ResyncPeriod time.Duration
154+
SignatureFetchTimeout time.Duration
155+
SignatureImportLimit int
156+
}
157+
158+
func (c *ImageSignatureImportControllerConfig) RunController(ctx ControllerContext) (bool, error) {
159+
controller := imagesignaturecontroller.NewSignatureImportController(
160+
context.Background(),
161+
ctx.ClientBuilder.OpenshiftInternalImageClientOrDie(bootstrappolicy.InfraImageImportControllerServiceAccountName),
162+
ctx.ImageInformers.Image().InternalVersion().Images(),
163+
c.ResyncPeriod,
164+
c.SignatureFetchTimeout,
165+
c.SignatureImportLimit,
166+
)
167+
go controller.Run(5, ctx.Stop)
168+
return true, nil
169+
}
170+
150171
type ImageImportControllerConfig struct {
151172
MaxScheduledImageImportsPerMinute int
152173
ScheduledImageImportMinimumIntervalSeconds int
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package signature
2+
3+
import (
4+
"context"
5+
"crypto/sha256"
6+
"fmt"
7+
"time"
8+
9+
"github.com/containers/image/docker"
10+
11+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12+
13+
imageapi "github.com/openshift/origin/pkg/image/apis/image"
14+
)
15+
16+
type containerImageSignatureDownloader struct {
17+
ctx context.Context
18+
timeout time.Duration
19+
}
20+
21+
func NewContainerImageSignatureDownloader(ctx context.Context, timeout time.Duration) SignatureDownloader {
22+
return &containerImageSignatureDownloader{
23+
ctx: ctx,
24+
timeout: timeout,
25+
}
26+
}
27+
28+
func (s *containerImageSignatureDownloader) DownloadImageSignatures(image *imageapi.Image) ([]imageapi.ImageSignature, error) {
29+
reference, err := docker.ParseReference("//" + image.DockerImageReference)
30+
if err != nil {
31+
return nil, err
32+
}
33+
source, err := reference.NewImageSource(nil, nil)
34+
if err != nil {
35+
return nil, err
36+
}
37+
defer source.Close()
38+
39+
ctx, cancel := context.WithTimeout(s.ctx, s.timeout)
40+
defer cancel()
41+
42+
signatures, err := source.GetSignatures(ctx)
43+
if err != nil {
44+
return nil, err
45+
}
46+
47+
ret := []imageapi.ImageSignature{}
48+
for _, blob := range signatures {
49+
sig := imageapi.ImageSignature{Type: imageapi.ImageSignatureTypeAtomicImageV1}
50+
// This will use the name of the image (sha256:xxxx) and the SHA256 of the
51+
// signature itself as the signature name has to be unique for each
52+
// signature.
53+
sig.Name = imageapi.JoinImageStreamImage(image.Name, fmt.Sprintf("%x", sha256.Sum256(blob)))
54+
sig.Content = blob
55+
sig.Annotations = map[string]string{
56+
SignatureManagedAnnotation: "true",
57+
}
58+
sig.CreationTimestamp = metav1.Now()
59+
ret = append(ret, sig)
60+
}
61+
return ret, nil
62+
}

0 commit comments

Comments
 (0)