diff --git a/api/cli/cli.go b/api/cli/cli.go index 67005fddb..f6035f298 100644 --- a/api/cli/cli.go +++ b/api/cli/cli.go @@ -60,6 +60,7 @@ func CLIFlags() *portainer.CLIFlags { LogLevel: kingpin.Flag("log-level", "Set the minimum logging level to show").Default("INFO").Enum("DEBUG", "INFO", "WARN", "ERROR"), LogMode: kingpin.Flag("log-mode", "Set the logging output mode").Default("PRETTY").Enum("NOCOLOR", "PRETTY", "JSON"), KubectlShellImage: kingpin.Flag("kubectl-shell-image", "Kubectl shell image").Envar(portainer.KubectlShellImageEnvVar).Default(portainer.DefaultKubectlShellImage).String(), + PullLimitCheckDisabled: kingpin.Flag("pull-limit-check-disabled", "Pull limit check").Envar(portainer.PullLimitCheckDisabledEnvVar).Default(defaultPullLimitCheckDisabled).Bool(), } } diff --git a/api/cli/defaults.go b/api/cli/defaults.go index ca426cdad..13aa2df93 100644 --- a/api/cli/defaults.go +++ b/api/cli/defaults.go @@ -4,20 +4,21 @@ package cli const ( - defaultBindAddress = ":9000" - defaultHTTPSBindAddress = ":9443" - defaultTunnelServerAddress = "0.0.0.0" - defaultTunnelServerPort = "8000" - defaultDataDirectory = "/data" - defaultAssetsDirectory = "./" - defaultTLS = "false" - defaultTLSSkipVerify = "false" - defaultTLSCACertPath = "/certs/ca.pem" - defaultTLSCertPath = "/certs/cert.pem" - defaultTLSKeyPath = "/certs/key.pem" - defaultHTTPDisabled = "false" - defaultHTTPEnabled = "false" - defaultSSL = "false" - defaultBaseURL = "/" - defaultSecretKeyName = "portainer" + defaultBindAddress = ":9000" + defaultHTTPSBindAddress = ":9443" + defaultTunnelServerAddress = "0.0.0.0" + defaultTunnelServerPort = "8000" + defaultDataDirectory = "/data" + defaultAssetsDirectory = "./" + defaultTLS = "false" + defaultTLSSkipVerify = "false" + defaultTLSCACertPath = "/certs/ca.pem" + defaultTLSCertPath = "/certs/cert.pem" + defaultTLSKeyPath = "/certs/key.pem" + defaultHTTPDisabled = "false" + defaultHTTPEnabled = "false" + defaultSSL = "false" + defaultBaseURL = "/" + defaultSecretKeyName = "portainer" + defaultPullLimitCheckDisabled = "false" ) diff --git a/api/cli/defaults_windows.go b/api/cli/defaults_windows.go index ed5996004..a9d02da65 100644 --- a/api/cli/defaults_windows.go +++ b/api/cli/defaults_windows.go @@ -1,21 +1,22 @@ package cli const ( - defaultBindAddress = ":9000" - defaultHTTPSBindAddress = ":9443" - defaultTunnelServerAddress = "0.0.0.0" - defaultTunnelServerPort = "8000" - defaultDataDirectory = "C:\\data" - defaultAssetsDirectory = "./" - defaultTLS = "false" - defaultTLSSkipVerify = "false" - defaultTLSCACertPath = "C:\\certs\\ca.pem" - defaultTLSCertPath = "C:\\certs\\cert.pem" - defaultTLSKeyPath = "C:\\certs\\key.pem" - defaultHTTPDisabled = "false" - defaultHTTPEnabled = "false" - defaultSSL = "false" - defaultSnapshotInterval = "5m" - defaultBaseURL = "/" - defaultSecretKeyName = "portainer" + defaultBindAddress = ":9000" + defaultHTTPSBindAddress = ":9443" + defaultTunnelServerAddress = "0.0.0.0" + defaultTunnelServerPort = "8000" + defaultDataDirectory = "C:\\data" + defaultAssetsDirectory = "./" + defaultTLS = "false" + defaultTLSSkipVerify = "false" + defaultTLSCACertPath = "C:\\certs\\ca.pem" + defaultTLSCertPath = "C:\\certs\\cert.pem" + defaultTLSKeyPath = "C:\\certs\\key.pem" + defaultHTTPDisabled = "false" + defaultHTTPEnabled = "false" + defaultSSL = "false" + defaultSnapshotInterval = "5m" + defaultBaseURL = "/" + defaultSecretKeyName = "portainer" + defaultPullLimitCheckDisabled = "false" ) diff --git a/api/cmd/portainer/main.go b/api/cmd/portainer/main.go index 068f31565..f16b3db0f 100644 --- a/api/cmd/portainer/main.go +++ b/api/cmd/portainer/main.go @@ -576,6 +576,7 @@ func buildServer(flags *portainer.CLIFlags) portainer.Server { AdminCreationDone: adminCreationDone, PendingActionsService: pendingActionsService, PlatformService: platformService, + PullLimitCheckDisabled: *flags.PullLimitCheckDisabled, } } diff --git a/api/http/handler/endpoints/endpoint_dockerhub_status.go b/api/http/handler/endpoints/endpoint_dockerhub_status.go index 7427a8750..c7d43149f 100644 --- a/api/http/handler/endpoints/endpoint_dockerhub_status.go +++ b/api/http/handler/endpoints/endpoint_dockerhub_status.go @@ -80,6 +80,13 @@ func (handler *Handler) endpointDockerhubStatus(w http.ResponseWriter, r *http.R } } + if handler.PullLimitCheckDisabled { + return response.JSON(w, &dockerhubStatusResponse{ + Limit: 10, + Remaining: 10, + }) + } + httpClient := client.NewHTTPClient() token, err := getDockerHubToken(httpClient, registry) if err != nil { diff --git a/api/http/handler/endpoints/handler.go b/api/http/handler/endpoints/handler.go index d1e323e8f..0260acaf0 100644 --- a/api/http/handler/endpoints/handler.go +++ b/api/http/handler/endpoints/handler.go @@ -26,19 +26,20 @@ func hideFields(endpoint *portainer.Endpoint) { // Handler is the HTTP handler used to handle environment(endpoint) operations. type Handler struct { *mux.Router - requestBouncer security.BouncerService - DataStore dataservices.DataStore - FileService portainer.FileService - ProxyManager *proxy.Manager - ReverseTunnelService portainer.ReverseTunnelService - SnapshotService portainer.SnapshotService - K8sClientFactory *cli.ClientFactory - ComposeStackManager portainer.ComposeStackManager - AuthorizationService *authorization.Service - DockerClientFactory *dockerclient.ClientFactory - BindAddress string - BindAddressHTTPS string - PendingActionsService *pendingactions.PendingActionsService + requestBouncer security.BouncerService + DataStore dataservices.DataStore + FileService portainer.FileService + ProxyManager *proxy.Manager + ReverseTunnelService portainer.ReverseTunnelService + SnapshotService portainer.SnapshotService + K8sClientFactory *cli.ClientFactory + ComposeStackManager portainer.ComposeStackManager + AuthorizationService *authorization.Service + DockerClientFactory *dockerclient.ClientFactory + BindAddress string + BindAddressHTTPS string + PendingActionsService *pendingactions.PendingActionsService + PullLimitCheckDisabled bool } // NewHandler creates a handler to manage environment(endpoint) operations. diff --git a/api/http/server.go b/api/http/server.go index 12925d479..3b3fff77d 100644 --- a/api/http/server.go +++ b/api/http/server.go @@ -112,6 +112,7 @@ type Server struct { AdminCreationDone chan struct{} PendingActionsService *pendingactions.PendingActionsService PlatformService platform.Service + PullLimitCheckDisabled bool } // Start starts the HTTP server @@ -181,6 +182,7 @@ func (server *Server) Start() error { endpointHandler.BindAddress = server.BindAddress endpointHandler.BindAddressHTTPS = server.BindAddressHTTPS endpointHandler.PendingActionsService = server.PendingActionsService + endpointHandler.PullLimitCheckDisabled = server.PullLimitCheckDisabled var endpointEdgeHandler = endpointedge.NewHandler(requestBouncer, server.DataStore, server.FileService, server.ReverseTunnelService) diff --git a/api/portainer.go b/api/portainer.go index 1f57b0ada..0c8b92b08 100644 --- a/api/portainer.go +++ b/api/portainer.go @@ -134,6 +134,7 @@ type ( LogLevel *string LogMode *string KubectlShellImage *string + PullLimitCheckDisabled *bool } // CustomTemplateVariableDefinition @@ -1689,6 +1690,8 @@ const ( PortainerCacheHeader = "X-Portainer-Cache" // KubectlShellImageEnvVar is the environment variable used to override the default kubectl shell image KubectlShellImageEnvVar = "KUBECTL_SHELL_IMAGE" + // PullLimitCheckDisabledEnvVar is the environment variable used to disable the pull limit check + PullLimitCheckDisabledEnvVar = "PULL_LIMIT_CHECK_DISABLED" ) // List of supported features