Skip to content

Commit dcf67d8

Browse files
feat(docker): backport --pull-limit-check-disabled cli flag [BE-11820] (#658)
1 parent f5f689c commit dcf67d8

6 files changed

Lines changed: 120 additions & 103 deletions

File tree

agent.go

Lines changed: 36 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -81,39 +81,40 @@ type (
8181

8282
// Options are the options used to start an agent.
8383
Options struct {
84-
AssetsPath string
85-
AgentServerAddr string
86-
AgentServerPort string
87-
AgentSecurityShutdown time.Duration
88-
ClusterAddress string
89-
ClusterProbeTimeout time.Duration
90-
ClusterProbeInterval time.Duration
91-
DataPath string
92-
SharedSecret string
93-
EdgeMode bool
94-
EdgeAsyncMode bool
95-
EdgeKey string
96-
EdgeID string
97-
EdgeUIServerAddr string
98-
EdgeUIServerPort string
99-
EdgeInactivityTimeout string
100-
EdgeInsecurePoll bool
101-
EdgeTunnel bool
102-
EdgeTunnelProxy string
103-
EdgeMetaFields EdgeMetaFields
104-
LogLevel string
105-
LogMode string
106-
SSLCert string
107-
SSLKey string
108-
SSLCACert string
109-
CertRetryInterval time.Duration
110-
AWSClientCert string
111-
AWSClientKey string
112-
AWSClientBundle string
113-
AWSRoleARN string
114-
AWSTrustAnchorARN string
115-
AWSProfileARN string
116-
AWSRegion string
84+
AssetsPath string
85+
AgentServerAddr string
86+
AgentServerPort string
87+
AgentSecurityShutdown time.Duration
88+
ClusterAddress string
89+
ClusterProbeTimeout time.Duration
90+
ClusterProbeInterval time.Duration
91+
DataPath string
92+
SharedSecret string
93+
EdgeMode bool
94+
EdgeAsyncMode bool
95+
EdgeKey string
96+
EdgeID string
97+
EdgeUIServerAddr string
98+
EdgeUIServerPort string
99+
EdgeInactivityTimeout string
100+
EdgeInsecurePoll bool
101+
EdgeTunnel bool
102+
EdgeTunnelProxy string
103+
EdgeMetaFields EdgeMetaFields
104+
LogLevel string
105+
LogMode string
106+
SSLCert string
107+
SSLKey string
108+
SSLCACert string
109+
CertRetryInterval time.Duration
110+
AWSClientCert string
111+
AWSClientKey string
112+
AWSClientBundle string
113+
AWSRoleARN string
114+
AWSTrustAnchorARN string
115+
AWSProfileARN string
116+
AWSRegion string
117+
PullLimitCheckDisabled bool
117118
}
118119

119120
// PciDevice is the representation of a physical pci device on a host
@@ -318,6 +319,8 @@ const (
318319
ComposePathPrefix = "portainer-compose-unpacker"
319320
// EdgeIdEnvVarName is the environment variable name of the edge ID for per device edge stack configurations
320321
EdgeIdEnvVarName = "PORTAINER_EDGE_ID"
322+
// DefaultPullLimitCheckDisabled is the default value for the registry pull limit check
323+
DefaultPullLimitCheckDisabled = "false"
321324
)
322325

323326
const (

http/handler/dockerhub/dockerhub_status.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ func (handler *Handler) dockerhubStatus(w http.ResponseWriter, r *http.Request)
4949
return httperror.BadRequest("Invalid request payload", err)
5050
}
5151

52+
if handler.PullLimitCheckDisabled {
53+
return response.JSON(w, &dockerhubStatusResponse{
54+
Limit: 10,
55+
Remaining: 10,
56+
})
57+
}
58+
5259
httpClient := &http.Client{
5360
Timeout: time.Second * 3,
5461
}

http/handler/dockerhub/handler.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ import (
1212
// Handler represents an HTTP API Handler for host specific actions
1313
type Handler struct {
1414
*mux.Router
15+
PullLimitCheckDisabled bool
1516
}
1617

1718
// NewHandler returns a new instance of Handler
18-
func NewHandler(notaryService *security.NotaryService) *Handler {
19+
func NewHandler(notaryService *security.NotaryService, pullLimitCheckDisabled bool) *Handler {
1920
h := &Handler{
20-
Router: mux.NewRouter(),
21+
Router: mux.NewRouter(),
22+
PullLimitCheckDisabled: pullLimitCheckDisabled,
2123
}
2224

2325
h.Handle("/dockerhub",

http/handler/handler.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,16 @@ type Handler struct {
4646
// Config represents a server handler configuration
4747
// used to create a new handler
4848
type Config struct {
49-
SystemService agent.SystemService
50-
ClusterService agent.ClusterService
51-
SignatureService agent.DigitalSignatureService
52-
KubeClient *kubecli.KubeClient
53-
KubernetesDeployer *exec.KubernetesDeployer
54-
EdgeManager *edge.Manager
55-
RuntimeConfiguration *agent.RuntimeConfig
56-
UseTLS bool
57-
ContainerPlatform agent.ContainerPlatform
49+
SystemService agent.SystemService
50+
ClusterService agent.ClusterService
51+
SignatureService agent.DigitalSignatureService
52+
KubeClient *kubecli.KubeClient
53+
KubernetesDeployer *exec.KubernetesDeployer
54+
EdgeManager *edge.Manager
55+
RuntimeConfiguration *agent.RuntimeConfig
56+
UseTLS bool
57+
ContainerPlatform agent.ContainerPlatform
58+
PullLimitCheckDisabled bool
5859
}
5960

6061
var dockerAPIVersionRegexp = regexp.MustCompile(`(/v[0-9]\.[0-9]*)?`)
@@ -69,7 +70,7 @@ func NewHandler(config *Config) *Handler {
6970
browseHandler: browse.NewHandler(agentProxy, notaryService),
7071
browseHandlerV1: browse.NewHandlerV1(agentProxy, notaryService),
7172
dockerProxyHandler: docker.NewHandler(config.ClusterService, config.RuntimeConfiguration, notaryService, config.UseTLS),
72-
dockerhubHandler: dockerhub.NewHandler(notaryService),
73+
dockerhubHandler: dockerhub.NewHandler(notaryService, config.PullLimitCheckDisabled),
7374
diagnosticsHandler: diagnostics.NewHandler(config.ContainerPlatform, config.EdgeManager, notaryService),
7475
keyHandler: key.NewHandler(notaryService, config.EdgeManager),
7576
kubernetesHandler: kubernetes.NewHandler(notaryService, config.KubernetesDeployer),

http/server.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,16 @@ func NewAPIServer(config *APIServerConfig) *APIServer {
6868
// Start starts a new web server by listening on the specified listenAddr.
6969
func (server *APIServer) Start(edgeMode bool) error {
7070
config := &handler.Config{
71-
SystemService: server.systemService,
72-
ClusterService: server.clusterService,
73-
SignatureService: server.signatureService,
74-
RuntimeConfiguration: server.agentTags,
75-
EdgeManager: server.edgeManager,
76-
KubeClient: server.kubeClient,
77-
KubernetesDeployer: server.kubernetesDeployer,
78-
UseTLS: !edgeMode,
79-
ContainerPlatform: server.containerPlatform,
71+
SystemService: server.systemService,
72+
ClusterService: server.clusterService,
73+
SignatureService: server.signatureService,
74+
RuntimeConfiguration: server.agentTags,
75+
EdgeManager: server.edgeManager,
76+
KubeClient: server.kubeClient,
77+
KubernetesDeployer: server.kubernetesDeployer,
78+
UseTLS: !edgeMode,
79+
ContainerPlatform: server.containerPlatform,
80+
PullLimitCheckDisabled: server.agentOptions.PullLimitCheckDisabled,
8081
}
8182

8283
httpHandler := handler.NewHandler(config)

os/options.go

Lines changed: 52 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -11,43 +11,44 @@ import (
1111
)
1212

1313
const (
14-
EnvKeyAgentHost = "AGENT_HOST"
15-
EnvKeyAgentPort = "AGENT_PORT"
16-
EnvKeyClusterAddr = "AGENT_CLUSTER_ADDR"
17-
EnvKeyClusterProbeTimeout = "AGENT_CLUSTER_PROBE_TIMEOUT"
18-
EnvKeyClusterProbeInterval = "AGENT_CLUSTER_PROBE_INTERVAL"
19-
EnvKeyAgentSecret = "AGENT_SECRET"
20-
EnvKeyAgentSecurityShutdown = "AGENT_SECRET_TIMEOUT"
21-
EnvKeyAssetsPath = "ASSETS_PATH"
22-
EnvKeyDataPath = "DATA_PATH"
23-
EnvKeyEdge = "EDGE"
24-
EnvKeyEdgeAsync = "EDGE_ASYNC"
25-
EnvKeyEdgeKey = "EDGE_KEY"
26-
EnvKeyEdgeID = "EDGE_ID"
27-
EnvKeyEdgeServerHost = "EDGE_SERVER_HOST"
28-
EnvKeyEdgeServerPort = "EDGE_SERVER_PORT"
29-
EnvKeyEdgeInactivityTimeout = "EDGE_INACTIVITY_TIMEOUT"
30-
EnvKeyEdgeInsecurePoll = "EDGE_INSECURE_POLL"
31-
EnvKeyEdgeTunnel = "EDGE_TUNNEL"
32-
EnvKeyEdgeTunnelHttpProxy = "HTTP_PROXY"
33-
EnvKeyEdgeTunnelHttpsProxy = "HTTPS_PROXY"
34-
EnvKeyLogLevel = "LOG_LEVEL"
35-
EnvKeyLogMode = "LOG_MODE"
36-
EnvKeySSLCert = "MTLS_SSL_CERT"
37-
EnvKeySSLKey = "MTLS_SSL_KEY"
38-
EnvKeySSLCACert = "MTLS_SSL_CA"
39-
EnvKeyCertRetryInterval = "MTLS_CERT_RETRY_INTERVAL"
40-
EnvKeyAWSClientCert = "AWS_CLIENT_CERT"
41-
EnvKeyAWSClientKey = "AWS_CLIENT_KEY"
42-
EnvKeyAWSClientBundle = "AWS_CLIENT_BUNDLE"
43-
EnvKeyAWSRoleARN = "AWS_ROLE_ARN"
44-
EnvKeyAWSTrustAnchorARN = "AWS_TRUST_ANCHOR_ARN"
45-
EnvKeyAWSProfileARN = "AWS_PROFILE_ARN"
46-
EnvKeyAWSRegion = "AWS_REGION"
47-
EnvKeyUpdateID = "UPDATE_ID"
48-
EnvKeyEdgeGroups = "EDGE_GROUPS"
49-
EnvKeyEnvironmentGroup = "PORTAINER_GROUP"
50-
EnvKeyTags = "PORTAINER_TAGS"
14+
EnvKeyAgentHost = "AGENT_HOST"
15+
EnvKeyAgentPort = "AGENT_PORT"
16+
EnvKeyClusterAddr = "AGENT_CLUSTER_ADDR"
17+
EnvKeyClusterProbeTimeout = "AGENT_CLUSTER_PROBE_TIMEOUT"
18+
EnvKeyClusterProbeInterval = "AGENT_CLUSTER_PROBE_INTERVAL"
19+
EnvKeyAgentSecret = "AGENT_SECRET"
20+
EnvKeyAgentSecurityShutdown = "AGENT_SECRET_TIMEOUT"
21+
EnvKeyAssetsPath = "ASSETS_PATH"
22+
EnvKeyDataPath = "DATA_PATH"
23+
EnvKeyEdge = "EDGE"
24+
EnvKeyEdgeAsync = "EDGE_ASYNC"
25+
EnvKeyEdgeKey = "EDGE_KEY"
26+
EnvKeyEdgeID = "EDGE_ID"
27+
EnvKeyEdgeServerHost = "EDGE_SERVER_HOST"
28+
EnvKeyEdgeServerPort = "EDGE_SERVER_PORT"
29+
EnvKeyEdgeInactivityTimeout = "EDGE_INACTIVITY_TIMEOUT"
30+
EnvKeyEdgeInsecurePoll = "EDGE_INSECURE_POLL"
31+
EnvKeyEdgeTunnel = "EDGE_TUNNEL"
32+
EnvKeyEdgeTunnelHttpProxy = "HTTP_PROXY"
33+
EnvKeyEdgeTunnelHttpsProxy = "HTTPS_PROXY"
34+
EnvKeyLogLevel = "LOG_LEVEL"
35+
EnvKeyLogMode = "LOG_MODE"
36+
EnvKeySSLCert = "MTLS_SSL_CERT"
37+
EnvKeySSLKey = "MTLS_SSL_KEY"
38+
EnvKeySSLCACert = "MTLS_SSL_CA"
39+
EnvKeyCertRetryInterval = "MTLS_CERT_RETRY_INTERVAL"
40+
EnvKeyAWSClientCert = "AWS_CLIENT_CERT"
41+
EnvKeyAWSClientKey = "AWS_CLIENT_KEY"
42+
EnvKeyAWSClientBundle = "AWS_CLIENT_BUNDLE"
43+
EnvKeyAWSRoleARN = "AWS_ROLE_ARN"
44+
EnvKeyAWSTrustAnchorARN = "AWS_TRUST_ANCHOR_ARN"
45+
EnvKeyAWSProfileARN = "AWS_PROFILE_ARN"
46+
EnvKeyAWSRegion = "AWS_REGION"
47+
EnvKeyUpdateID = "UPDATE_ID"
48+
EnvKeyEdgeGroups = "EDGE_GROUPS"
49+
EnvKeyEnvironmentGroup = "PORTAINER_GROUP"
50+
EnvKeyTags = "PORTAINER_TAGS"
51+
EnvKeyPullLimitCheckDisabled = "PULL_LIMIT_CHECK_DISABLED"
5152
)
5253

5354
type EnvOptionParser struct{}
@@ -57,18 +58,19 @@ func NewEnvOptionParser() *EnvOptionParser {
5758
}
5859

5960
var (
60-
fAssetsPath = kingpin.Flag("assets", EnvKeyAssetsPath+" path to the assets folder").Envar(EnvKeyAssetsPath).Default(agent.DefaultAssetsPath).String()
61-
fAgentServerAddr = kingpin.Flag("host", EnvKeyAgentHost+" address on which the agent API will be exposed").Envar(EnvKeyAgentHost).Default(agent.DefaultAgentAddr).IP()
62-
fAgentServerPort = kingpin.Flag("port", EnvKeyAgentPort+" port on which the agent API will be exposed").Envar(EnvKeyAgentPort).Default(agent.DefaultAgentPort).Int()
63-
fAgentSecurityShutdown = kingpin.Flag("secret-timeout", EnvKeyAgentSecurityShutdown+" the duration after which the agent will be shutdown if not associated or secured by AGENT_SECRET. (defaults to 72h)").Envar(EnvKeyAgentSecurityShutdown).Default(agent.DefaultAgentSecurityShutdown).Duration()
64-
fClusterAddress = kingpin.Flag("cluster-addr", EnvKeyClusterAddr+" address (in the IP:PORT format) of an existing agent to join the agent cluster. When deploying the agent as a Docker Swarm service, we can leverage the internal Docker DNS to automatically join existing agents or form a cluster by using tasks.<AGENT_SERVICE_NAME>:<AGENT_PORT> as the address").Envar(EnvKeyClusterAddr).String()
65-
fClusterProbeTimeout = kingpin.Flag("agent-cluster-timeout", EnvKeyClusterProbeTimeout+" timeout interval for receiving agent member probe responses (only change this setting if you know what you're doing)").Envar(EnvKeyClusterProbeTimeout).Default(agent.DefaultClusterProbeTimeout).Duration()
66-
fClusterProbeInterval = kingpin.Flag("agent-cluster-interval", EnvKeyClusterProbeInterval+" interval for repeating failed agent member probe (only change this setting if you know what you're doing)").Envar(EnvKeyClusterProbeInterval).Default(agent.DefaultClusterProbeInterval).Duration()
67-
fDataPath = kingpin.Flag("data", EnvKeyDataPath+" path to the data folder").Envar(EnvKeyDataPath).Default(agent.DefaultDataPath).String()
68-
fSharedSecret = kingpin.Flag("secret", EnvKeyAgentSecret+" shared secret used in the signature verification process").Envar(EnvKeyAgentSecret).String()
69-
fLogLevel = kingpin.Flag("log-level", EnvKeyLogLevel+" defines the log output verbosity (default to INFO)").Envar(EnvKeyLogLevel).Default(agent.DefaultLogLevel).Enum("ERROR", "WARN", "INFO", "DEBUG")
70-
fLogMode = kingpin.Flag("log-mode", EnvKeyLogMode+" defines the logging output mode").Envar(EnvKeyLogMode).Default("PRETTY").Enum("NOCOLOR", "PRETTY", "JSON")
71-
fUpdateID = kingpin.Flag("update-id", "the edge update identifier that started this agent").Envar(EnvKeyUpdateID).Int()
61+
fAssetsPath = kingpin.Flag("assets", EnvKeyAssetsPath+" path to the assets folder").Envar(EnvKeyAssetsPath).Default(agent.DefaultAssetsPath).String()
62+
fAgentServerAddr = kingpin.Flag("host", EnvKeyAgentHost+" address on which the agent API will be exposed").Envar(EnvKeyAgentHost).Default(agent.DefaultAgentAddr).IP()
63+
fAgentServerPort = kingpin.Flag("port", EnvKeyAgentPort+" port on which the agent API will be exposed").Envar(EnvKeyAgentPort).Default(agent.DefaultAgentPort).Int()
64+
fAgentSecurityShutdown = kingpin.Flag("secret-timeout", EnvKeyAgentSecurityShutdown+" the duration after which the agent will be shutdown if not associated or secured by AGENT_SECRET. (defaults to 72h)").Envar(EnvKeyAgentSecurityShutdown).Default(agent.DefaultAgentSecurityShutdown).Duration()
65+
fClusterAddress = kingpin.Flag("cluster-addr", EnvKeyClusterAddr+" address (in the IP:PORT format) of an existing agent to join the agent cluster. When deploying the agent as a Docker Swarm service, we can leverage the internal Docker DNS to automatically join existing agents or form a cluster by using tasks.<AGENT_SERVICE_NAME>:<AGENT_PORT> as the address").Envar(EnvKeyClusterAddr).String()
66+
fClusterProbeTimeout = kingpin.Flag("agent-cluster-timeout", EnvKeyClusterProbeTimeout+" timeout interval for receiving agent member probe responses (only change this setting if you know what you're doing)").Envar(EnvKeyClusterProbeTimeout).Default(agent.DefaultClusterProbeTimeout).Duration()
67+
fClusterProbeInterval = kingpin.Flag("agent-cluster-interval", EnvKeyClusterProbeInterval+" interval for repeating failed agent member probe (only change this setting if you know what you're doing)").Envar(EnvKeyClusterProbeInterval).Default(agent.DefaultClusterProbeInterval).Duration()
68+
fDataPath = kingpin.Flag("data", EnvKeyDataPath+" path to the data folder").Envar(EnvKeyDataPath).Default(agent.DefaultDataPath).String()
69+
fSharedSecret = kingpin.Flag("secret", EnvKeyAgentSecret+" shared secret used in the signature verification process").Envar(EnvKeyAgentSecret).String()
70+
fLogLevel = kingpin.Flag("log-level", EnvKeyLogLevel+" defines the log output verbosity (default to INFO)").Envar(EnvKeyLogLevel).Default(agent.DefaultLogLevel).Enum("ERROR", "WARN", "INFO", "DEBUG")
71+
fLogMode = kingpin.Flag("log-mode", EnvKeyLogMode+" defines the logging output mode").Envar(EnvKeyLogMode).Default("PRETTY").Enum("NOCOLOR", "PRETTY", "JSON")
72+
fUpdateID = kingpin.Flag("update-id", "the edge update identifier that started this agent").Envar(EnvKeyUpdateID).Int()
73+
fPullLimitCheckDisabled = kingpin.Flag("pull-limit-check-disabled", "Pull limit check").Envar(EnvKeyPullLimitCheckDisabled).Default(agent.DefaultPullLimitCheckDisabled).Bool()
7274

7375
// Edge mode
7476
fEdgeMode = kingpin.Flag("edge", EnvKeyEdge+" enable Edge mode. Disabled by default, set to 1 or true to enable it").Envar(EnvKeyEdge).Bool()
@@ -166,6 +168,7 @@ func (parser *EnvOptionParser) Options() (*agent.Options, error) {
166168
TagsIDs: tagsIDs,
167169
UpdateID: *fUpdateID,
168170
},
171+
PullLimitCheckDisabled: *fPullLimitCheckDisabled,
169172
}, nil
170173
}
171174

0 commit comments

Comments
 (0)