From 3868202446d9b592daff3ef1fac1bd39e0902148 Mon Sep 17 00:00:00 2001 From: Ilia Donchenko Date: Thu, 19 Jul 2018 17:10:04 +0300 Subject: [PATCH 1/4] Various small code enhancements --- cmd/kube-api/server.go | 2 +- pkg/model/configmap.go | 7 +++---- pkg/model/deployment.go | 12 ++++++------ pkg/model/endpoint.go | 2 +- pkg/model/ingress.go | 4 ++-- pkg/model/namespace.go | 6 +++--- pkg/model/pod.go | 2 +- pkg/model/secret.go | 4 ++-- pkg/model/service.go | 4 ++-- pkg/model/volume.go | 2 +- pkg/router/handlers/configmap.go | 2 +- pkg/router/handlers/deployment.go | 8 +++----- pkg/router/handlers/ingress.go | 2 +- pkg/router/midlleware/access.go | 2 +- pkg/utils/timeoutreader/timeoutreader.go | 2 +- 15 files changed, 29 insertions(+), 32 deletions(-) diff --git a/cmd/kube-api/server.go b/cmd/kube-api/server.go index c413db38..b318aff1 100644 --- a/cmd/kube-api/server.go +++ b/cmd/kube-api/server.go @@ -37,7 +37,7 @@ func initServer(c *cli.Context) error { // Wait for interrupt signal to gracefully shutdown the server with // a timeout of 5 seconds. - quit := make(chan os.Signal) + quit := make(chan os.Signal, 1) signal.Notify(quit, os.Interrupt) // subscribe on interrupt event <-quit // wait for event logrus.Infoln("shutting down server...") diff --git a/pkg/model/configmap.go b/pkg/model/configmap.go index 786c0669..6bcd6e59 100644 --- a/pkg/model/configmap.go +++ b/pkg/model/configmap.go @@ -33,7 +33,7 @@ func ParseKubeConfigMapList(cmi interface{}, parseforuser bool) (*kube_types.Con } newCms = append(newCms, *newCm) } - return &kube_types.ConfigMapsList{newCms}, nil + return &kube_types.ConfigMapsList{ConfigMaps: newCms}, nil } // ParseKubeConfigMap parses kubernetes v1.ConfigMap to more convenient ConfigMap struct. @@ -45,7 +45,7 @@ func ParseKubeConfigMap(cmi interface{}, parseforuser bool) (*kube_types.ConfigM newData := make(map[string]string) for k, v := range cm.Data { - newData[k] = string(v) + newData[k] = v } owner := cm.GetObjectMeta().GetLabels()[ownerLabel] @@ -77,9 +77,8 @@ func (cm *ConfigMapKubeAPI) ToKube(nsName string, labels map[string]string) (*ap dec, err := base64.StdEncoding.DecodeString(v) if err != nil { return nil, []error{fmt.Errorf("unable to decode base64 string '%v': %v", v, err)} - } else { - cm.Data[k] = string(dec) } + cm.Data[k] = string(dec) } newCm := api_core.ConfigMap{ diff --git a/pkg/model/deployment.go b/pkg/model/deployment.go index 3a3753ec..f0d34617 100644 --- a/pkg/model/deployment.go +++ b/pkg/model/deployment.go @@ -56,7 +56,7 @@ func ParseKubeDeploymentList(deploys interface{}, parseforuser bool) (*kube_type deployments = append(deployments, *deployment) } - return &kube_types.DeploymentsList{deployments}, nil + return &kube_types.DeploymentsList{Deployments: deployments}, nil } // ParseKubeDeployment parses kubernetes v1.Deployment to more convenient Deployment struct @@ -102,7 +102,7 @@ func ParseKubeDeployment(deployment interface{}, parseforuser bool) (*kube_types } func getVolumeMode(volumes []api_core.Volume) map[string]int32 { - volumemap := make(map[string]int32, 0) + volumemap := make(map[string]int32) for _, v := range volumes { if v.ConfigMap != nil { volumemap[v.Name] = *v.ConfigMap.DefaultMode @@ -112,7 +112,7 @@ func getVolumeMode(volumes []api_core.Volume) map[string]int32 { } func getVolumeStorageName(volumes []api_core.Volume) map[string]string { - volumemap := make(map[string]string, 0) + volumemap := make(map[string]string) for _, v := range volumes { if v.PersistentVolumeClaim != nil { volumemap[v.Name] = v.PersistentVolumeClaim.ClaimName @@ -196,7 +196,7 @@ func (deploy *DeploymentKubeAPI) ToKube(nsName string, labels map[string]string) } func makeContainers(containers []kube_types.Container) ([]api_core.Container, []error) { - var containersAfter []api_core.Container + containersAfter := make([]api_core.Container, len(containers)) for _, c := range containers { errs := validateContainer(c, c.Limits.CPU, c.Limits.Memory) @@ -297,8 +297,8 @@ func makeContainerResourceQuota(cpu, memory uint) *api_core.ResourceRequirements func makeTemplateVolumes(containers []kube_types.Container) ([]api_core.Volume, error) { templateVolumes := make([]api_core.Volume, 0) - existingVolume := make(map[string]bool, 0) - existingMountPath := make(map[string]bool, 0) + existingVolume := make(map[string]bool) + existingMountPath := make(map[string]bool) for _, c := range containers { for _, v := range c.VolumeMounts { diff --git a/pkg/model/endpoint.go b/pkg/model/endpoint.go index 5e498d38..c7e56949 100644 --- a/pkg/model/endpoint.go +++ b/pkg/model/endpoint.go @@ -61,7 +61,7 @@ func ParseKubeEndpointList(endpointi interface{}) (*EndpointsList, error) { } newEndpoints = append(newEndpoints, *newEndpoint) } - return &EndpointsList{newEndpoints}, nil + return &EndpointsList{Endpoints: newEndpoints}, nil } // ParseKubeEndpoint parses kubernetes v1.Endpoint to more convenient Endpoint struct diff --git a/pkg/model/ingress.go b/pkg/model/ingress.go index b55c7fb7..89eb29c1 100644 --- a/pkg/model/ingress.go +++ b/pkg/model/ingress.go @@ -36,7 +36,7 @@ func ParseKubeIngressList(ingressi interface{}, parseforuser bool) (*kube_types. } newIngresses = append(newIngresses, *newIngress) } - return &kube_types.IngressesList{newIngresses}, nil + return &kube_types.IngressesList{Ingress: newIngresses}, nil } // ParseKubeIngress parses kubernetes v1beta1.Ingress to more convenient Ingress struct @@ -85,7 +85,7 @@ func parseRules(rules []api_extensions.IngressRule, secrets map[string]string) [ } func parseTLS(tlss []api_extensions.IngressTLS) map[string]string { - secrets := make(map[string]string, 0) + secrets := make(map[string]string) for _, v := range tlss { for _, h := range v.Hosts { diff --git a/pkg/model/namespace.go b/pkg/model/namespace.go index 0709f2af..74b8b7df 100644 --- a/pkg/model/namespace.go +++ b/pkg/model/namespace.go @@ -41,7 +41,7 @@ func ParseKubeResourceQuotaList(quotas interface{}, parseforuser bool) (*kube_ty } namespaces = append(namespaces, *ns) } - return &kube_types.NamespacesList{namespaces}, nil + return &kube_types.NamespacesList{Namespaces: namespaces}, nil } // ParseKubeResourceQuota parses kubernetes v1.ResourceQuota to more convenient Namespace struct. @@ -136,11 +136,11 @@ func MakeResourceQuota(ns string, labels map[string]string, resources kube_types func ParseNamespaceListForUser(headers UserHeaderDataMap, nsl []kube_types.Namespace) *kube_types.NamespacesList { nso := make([]kube_types.Namespace, 0) - ret := kube_types.NamespacesList{nso} + ret := kube_types.NamespacesList{Namespaces: nso} for _, ns := range nsl { ns = *ParseForUser(&ns, headers) if ns.Label != "" { - ret.Namespaces = append(ret.Namespaces, kube_types.Namespace(ns)) + ret.Namespaces = append(ret.Namespaces, ns) } } return &ret diff --git a/pkg/model/pod.go b/pkg/model/pod.go index 6135331f..6b0d5798 100644 --- a/pkg/model/pod.go +++ b/pkg/model/pod.go @@ -20,7 +20,7 @@ func ParseKubePodList(pods interface{}, parseforuser bool) *kube_types.PodsList for _, po := range podList.Items { ret = append(ret, ParseKubePod(&po, parseforuser)) } - return &kube_types.PodsList{ret} + return &kube_types.PodsList{Pods: ret} } // ParseKubePod parses kubernetes v1.PodList to more convenient Pod struct. diff --git a/pkg/model/secret.go b/pkg/model/secret.go index e611199c..700c6504 100644 --- a/pkg/model/secret.go +++ b/pkg/model/secret.go @@ -52,7 +52,7 @@ func ParseKubeSecretList(secreti interface{}, parseforuser bool) (*SecretWithPar secrets = append(secrets, *newSecret) } } - return &SecretWithParamList{secrets}, nil + return &SecretWithParamList{Secrets: secrets}, nil } // ParseKubeSecret parses kubernetes v1.Secret to more convenient Secret struct. @@ -111,7 +111,7 @@ func (secret *SecretWithParam) ToKube(nsName string, labels map[string]string) ( } func makeSecretData(data map[string]string) map[string][]byte { - newData := make(map[string][]byte, 0) + newData := make(map[string][]byte) for k, v := range data { newData[k] = []byte(v) } diff --git a/pkg/model/service.go b/pkg/model/service.go index b64336d5..9d76d925 100644 --- a/pkg/model/service.go +++ b/pkg/model/service.go @@ -65,7 +65,7 @@ func ParseKubeServiceList(ns interface{}, parseforuser bool) (*ServiceWithParamL serviceList = append(serviceList, *service) } } - return &ServiceWithParamList{serviceList}, nil + return &ServiceWithParamList{Services: serviceList}, nil } // ParseKubeService parses kubernetes v1.Service to more convenient Service struct. @@ -167,7 +167,7 @@ func (service *ServiceWithParam) ToKube(nsName string, labels map[string]string) } func makeServicePorts(ports []kube_types.ServicePort) []api_core.ServicePort { - var serviceports []api_core.ServicePort + serviceports := make([]api_core.ServicePort, len(ports)) for _, port := range ports { if port.Port == nil { port.Port = &port.TargetPort diff --git a/pkg/model/volume.go b/pkg/model/volume.go index 31b630d9..6c1eac1b 100644 --- a/pkg/model/volume.go +++ b/pkg/model/volume.go @@ -37,7 +37,7 @@ func ParseKubePersistentVolumeClaimList(ns interface{}, parseforuser bool) (*kub } pvcList = append(pvcList, *pvc) } - return &kube_types.VolumesList{pvcList}, nil + return &kube_types.VolumesList{Volumes: pvcList}, nil } // ParseKubePersistentVolumeClaim parses kubernetes v1.PersistentVolume to more convenient PersistentVolumeClaimWithOwner struct. diff --git a/pkg/router/handlers/configmap.go b/pkg/router/handlers/configmap.go index 4a967a2a..f88ef07e 100644 --- a/pkg/router/handlers/configmap.go +++ b/pkg/router/handlers/configmap.go @@ -345,7 +345,7 @@ func GetSelectedConfigMaps(ctx *gin.Context) { kube := ctx.MustGet(m.KubeClient).(*kubernetes.Kube) - ret := make(kube_types.SelectedConfigMapsList, 0) + ret := make(kube_types.SelectedConfigMapsList) role := ctx.MustGet(m.UserRole).(string) if role == m.RoleUser { diff --git a/pkg/router/handlers/deployment.go b/pkg/router/handlers/deployment.go index 6dd59dd8..f29dd62a 100644 --- a/pkg/router/handlers/deployment.go +++ b/pkg/router/handlers/deployment.go @@ -246,11 +246,9 @@ func CreateDeployment(ctx *gin.Context) { if pvc, err := kube.GetPersistentVolumeClaim(namespace, v.PersistentVolumeClaim.ClaimName); err != nil { gonic.Gonic(model.ParseKubernetesResourceError(err, kubeErrors.ErrUnableGetResource()), ctx) return - } else { - if pvc.Status.Phase != "Bound" { - gonic.Gonic(kubeErrors.ErrVolumeNotReady().AddDetailF("Volume status: %v", pvc.Status.Phase), ctx) - return - } + } else if pvc.Status.Phase != "Bound" { + gonic.Gonic(kubeErrors.ErrVolumeNotReady().AddDetailF("Volume status: %v", pvc.Status.Phase), ctx) + return } } } diff --git a/pkg/router/handlers/ingress.go b/pkg/router/handlers/ingress.go index a651f486..726ae3af 100644 --- a/pkg/router/handlers/ingress.go +++ b/pkg/router/handlers/ingress.go @@ -344,7 +344,7 @@ func GetSelectedIngresses(ctx *gin.Context) { kube := ctx.MustGet(m.KubeClient).(*kubernetes.Kube) - ingresses := make(kube_types.SelectedIngressesList, 0) + ingresses := make(kube_types.SelectedIngressesList) role := ctx.MustGet(m.UserRole).(string) if role == m.RoleUser { diff --git a/pkg/router/midlleware/access.go b/pkg/router/midlleware/access.go index acf2dbb3..d9f3234e 100644 --- a/pkg/router/midlleware/access.go +++ b/pkg/router/midlleware/access.go @@ -79,7 +79,7 @@ func CheckAccess(ctx *gin.Context, level []kubeModel.AccessLevel) { func containsAccess(access kubeModel.AccessLevel, in ...kubeModel.AccessLevel) bool { contains := false - userAccess := kubeModel.AccessLevel(access) + userAccess := access for _, acc := range in { if acc == userAccess { return true diff --git a/pkg/utils/timeoutreader/timeoutreader.go b/pkg/utils/timeoutreader/timeoutreader.go index 30468e47..8b080f06 100644 --- a/pkg/utils/timeoutreader/timeoutreader.go +++ b/pkg/utils/timeoutreader/timeoutreader.go @@ -96,7 +96,7 @@ func (this *TimeoutReader) Read(p []byte) (int, error) { if err == io.ErrUnexpectedEOF { err = nil } - this.done <- &readResponse{n, err} + this.done <- &readResponse{n: n, err: err} } }() From d2ae5a203286a135e123df3b75b18cbb199a1bc7 Mon Sep 17 00:00:00 2001 From: Ilia Donchenko Date: Tue, 31 Jul 2018 13:05:55 +0300 Subject: [PATCH 2/4] Add ImagePullSecrets. --- Gopkg.lock | 24 ++-- Gopkg.toml | 2 +- pkg/kubernetes/configmap.go | 2 +- pkg/kubernetes/secret.go | 18 ++- pkg/model/deployment.go | 33 ++++-- pkg/model/pod.go | 7 +- pkg/model/secret.go | 62 ++++------ pkg/router/handlers/secret.go | 110 ++++++++++++++++-- pkg/router/router.go | 3 +- .../kube-client/pkg/model/configmap.go | 5 +- .../kube-client/pkg/model/deployment.go | 3 +- .../kube-client/pkg/model/group.go | 10 +- .../kube-client/pkg/model/ingress.go | 5 +- .../containerum/kube-client/pkg/model/pod.go | 14 +-- vendor/github.com/imdario/mergo/merge.go | 7 ++ .../mailru/easyjson/jlexer/lexer.go | 13 ++- vendor/github.com/sirupsen/logrus/entry.go | 26 +++-- vendor/github.com/sirupsen/logrus/exported.go | 20 +++- .../github.com/sirupsen/logrus/formatter.go | 20 ++-- .../sirupsen/logrus/json_formatter.go | 12 +- vendor/github.com/sirupsen/logrus/logger.go | 16 ++- .../sirupsen/logrus/text_formatter.go | 31 +++-- vendor/golang.org/x/net/http2/frame.go | 63 +++++++--- vendor/golang.org/x/net/http2/server.go | 6 + vendor/golang.org/x/sys/unix/ioctl.go | 30 +++++ .../golang.org/x/sys/unix/syscall_darwin.go | 4 +- .../x/sys/unix/syscall_dragonfly.go | 4 +- .../golang.org/x/sys/unix/syscall_freebsd.go | 4 +- vendor/golang.org/x/sys/unix/syscall_linux.go | 70 ++++++++++- .../x/sys/unix/syscall_linux_mipsx.go | 7 +- .../golang.org/x/sys/unix/syscall_netbsd.go | 4 +- .../golang.org/x/sys/unix/syscall_openbsd.go | 4 +- .../golang.org/x/sys/unix/syscall_solaris.go | 4 +- .../x/sys/unix/zsyscall_linux_mips.go | 12 ++ .../x/sys/unix/zsyscall_linux_mipsle.go | 12 ++ .../golang.org/x/sys/unix/ztypes_linux_386.go | 22 ++++ .../x/sys/unix/ztypes_linux_amd64.go | 24 ++++ .../golang.org/x/sys/unix/ztypes_linux_arm.go | 23 ++++ .../x/sys/unix/ztypes_linux_arm64.go | 24 ++++ .../x/sys/unix/ztypes_linux_mips.go | 23 ++++ .../x/sys/unix/ztypes_linux_mips64.go | 24 ++++ .../x/sys/unix/ztypes_linux_mips64le.go | 24 ++++ .../x/sys/unix/ztypes_linux_mipsle.go | 23 ++++ .../x/sys/unix/ztypes_linux_ppc64.go | 24 ++++ .../x/sys/unix/ztypes_linux_ppc64le.go | 24 ++++ .../x/sys/unix/ztypes_linux_s390x.go | 24 ++++ .../x/sys/windows/syscall_windows.go | 2 + 47 files changed, 763 insertions(+), 165 deletions(-) create mode 100644 vendor/golang.org/x/sys/unix/ioctl.go diff --git a/Gopkg.lock b/Gopkg.lock index 18745dc2..d964d980 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -41,8 +41,8 @@ ".", "pkg/model" ] - revision = "84994c3603435e72e840178917f0ee88b0da0bf8" - version = "v0.23.17" + revision = "90bd8c0759be7f3cedd93e56e264fab8e8b5139f" + version = "v0.23.20" [[projects]] name = "github.com/containerum/utils" @@ -241,8 +241,8 @@ [[projects]] name = "github.com/imdario/mergo" packages = ["."] - revision = "9316a62528ac99aaecb4e47eadd6dc8aa6533d58" - version = "v0.3.5" + revision = "9f23e2d6bd2a77f959b2bf6acdbefd708a83a4a4" + version = "v0.3.6" [[projects]] name = "github.com/json-iterator/go" @@ -270,7 +270,7 @@ "jlexer", "jwriter" ] - revision = "efc7eb8984d6655c26b5c9d2e65c024e5767c37c" + revision = "03f2033d19d5860aef995fe360ac7d395cd8ce65" [[projects]] name = "github.com/mattn/go-isatty" @@ -317,8 +317,8 @@ [[projects]] name = "github.com/sirupsen/logrus" packages = ["."] - revision = "c155da19408a8799da419ed3eeb0cb5db0ad5dbc" - version = "v1.0.5" + revision = "3e01752db0189b9157070a0e1668a620f9a85da2" + version = "v1.0.6" [[projects]] name = "github.com/smartystreets/assertions" @@ -368,7 +368,7 @@ branch = "master" name = "golang.org/x/crypto" packages = ["ssh/terminal"] - revision = "a49355c7e3f8fe157a85be2f77e6e269a0f89602" + revision = "c126467f60eb25f8f27e5a981f32a87e3965053f" [[projects]] branch = "master" @@ -382,7 +382,7 @@ "webdav", "webdav/internal/xml" ] - revision = "d0887baf81f4598189d4e12a37c6da86f0bba4d0" + revision = "a0f8a16cb08c06df97cbdf9c47f4731ba548c33c" [[projects]] branch = "master" @@ -397,7 +397,7 @@ "unix", "windows" ] - revision = "ac767d655b305d4e9612f5f6e33120b9176c4ad4" + revision = "bd9dbc187b6e1dacfdd2722a87e83093c2d7bd6e" [[projects]] name = "golang.org/x/text" @@ -586,7 +586,7 @@ branch = "master" name = "k8s.io/kube-openapi" packages = ["pkg/common"] - revision = "0cf8f7e6ed1d2e3d47d02e3b6e559369af24d803" + revision = "d8ea2fe547a448256204cfc68dfee7b26c720acb" [[projects]] name = "k8s.io/kubernetes" @@ -597,6 +597,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "bf0aabfeeee6539131dcdc3a7228e84b303602ef85049a048b16121f0501c022" + inputs-digest = "98055b898bf1e91f84ae68f5ea9c363581bb6b335b541bf730c4f33354af751a" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 5e01e0fa..3983b0ac 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -71,7 +71,7 @@ required = ["github.com/containerum/kube-client"] [[constraint]] name = "github.com/containerum/kube-client" - version = "^0.23.2" + version = "^0.23.20" [[constraint]] name = "k8s.io/kubernetes" diff --git a/pkg/kubernetes/configmap.go b/pkg/kubernetes/configmap.go index 61977fdc..b1a40951 100644 --- a/pkg/kubernetes/configmap.go +++ b/pkg/kubernetes/configmap.go @@ -8,7 +8,7 @@ import ( //GetConfigMapList returns config maps list func (k *Kube) GetConfigMapList(namespace string) (*api_core.ConfigMapList, error) { - cmAfter, err := k.CoreV1().ConfigMaps(namespace).List(api_meta.ListOptions{}) + cmAfter, err := k.CoreV1().ConfigMaps("").List(api_meta.ListOptions{}) if err != nil { log.WithFields(log.Fields{ "Namespace": namespace, diff --git a/pkg/kubernetes/secret.go b/pkg/kubernetes/secret.go index 6706ec3f..0c4ac98c 100644 --- a/pkg/kubernetes/secret.go +++ b/pkg/kubernetes/secret.go @@ -6,9 +6,21 @@ import ( api_meta "k8s.io/apimachinery/pkg/apis/meta/v1" ) -//GetSecretList returns secrets list -func (k *Kube) GetSecretList(nsName string) (*api_core.SecretList, error) { - secrets, err := k.CoreV1().Secrets(nsName).List(api_meta.ListOptions{}) +//GetTLSSecretList returns TLS secrets list +func (k *Kube) GetTLSSecretList(nsName string) (*api_core.SecretList, error) { + secrets, err := k.CoreV1().Secrets(nsName).List(api_meta.ListOptions{FieldSelector: "type=Opaque"}) + if err != nil { + log.WithFields(log.Fields{ + "Namespace": nsName, + }).Error(err) + return nil, err + } + return secrets, nil +} + +//GetDockerSecretList returns Docker secrets list +func (k *Kube) GetDockerSecretList(nsName string) (*api_core.SecretList, error) { + secrets, err := k.CoreV1().Secrets(nsName).List(api_meta.ListOptions{FieldSelector: "type=kubernetes.io/dockerconfigjson"}) if err != nil { log.WithFields(log.Fields{ "Namespace": nsName, diff --git a/pkg/model/deployment.go b/pkg/model/deployment.go index 3a3753ec..e56f3a2e 100644 --- a/pkg/model/deployment.go +++ b/pkg/model/deployment.go @@ -84,14 +84,15 @@ func ParseKubeDeployment(deployment interface{}, parseforuser bool) (*kube_types UpdatedReplicas: int(deploy.Status.UpdatedReplicas), UnavailableReplicas: int(deploy.Status.UnavailableReplicas), }, - CreatedAt: deploy.ObjectMeta.CreationTimestamp.UTC().Format(time.RFC3339), - SolutionID: deploy.GetObjectMeta().GetLabels()[solutionLabel], - Containers: containers, - TotalCPU: uint(totalcpu.ScaledValue(api_resource.Milli)), - TotalMemory: uint(totalmem.Value() / 1024 / 1024), - Owner: deploy.GetObjectMeta().GetLabels()[ownerLabel], - Version: version, - Active: true, + CreatedAt: deploy.ObjectMeta.CreationTimestamp.UTC().Format(time.RFC3339), + SolutionID: deploy.GetObjectMeta().GetLabels()[solutionLabel], + Containers: containers, + ImagePullSecrets: getImagePullSecrets(deploy.Spec.Template.Spec.ImagePullSecrets), + TotalCPU: uint(totalcpu.ScaledValue(api_resource.Milli)), + TotalMemory: uint(totalmem.Value() / 1024 / 1024), + Owner: deploy.GetObjectMeta().GetLabels()[ownerLabel], + Version: version, + Active: true, } if parseforuser { @@ -121,6 +122,14 @@ func getVolumeStorageName(volumes []api_core.Volume) map[string]string { return volumemap } +func getImagePullSecrets(secrets []api_core.LocalObjectReference) []string { + secretsList := []string{} + for _, v := range secrets { + secretsList = append(secretsList, v.Name) + } + return secretsList +} + //ToKube creates kubernetes v1.Deployment from Deployment struct and namespace labels func (deploy *DeploymentKubeAPI) ToKube(nsName string, labels map[string]string) (*api_apps.Deployment, []error) { err := deploy.Validate() @@ -159,6 +168,11 @@ func (deploy *DeploymentKubeAPI) ToKube(nsName string, labels map[string]string) return nil, []error{verr} } + var imagePullSecrets []api_core.LocalObjectReference + for _, im := range deploy.ImagePullSecrets { + imagePullSecrets = append(imagePullSecrets, api_core.LocalObjectReference{im}) + } + newDeploy := api_apps.Deployment{ TypeMeta: api_meta.TypeMeta{ Kind: deploymentKind, @@ -183,7 +197,8 @@ func (deploy *DeploymentKubeAPI) ToKube(nsName string, labels map[string]string) NodeSelector: map[string]string{ "role": "slave", }, - Volumes: volumes, + ImagePullSecrets: imagePullSecrets, + Volumes: volumes, }, ObjectMeta: api_meta.ObjectMeta{ Labels: labels, diff --git a/pkg/model/pod.go b/pkg/model/pod.go index 6135331f..7b92a9ac 100644 --- a/pkg/model/pod.go +++ b/pkg/model/pod.go @@ -39,9 +39,10 @@ func ParseKubePod(pod interface{}, parseforuser bool) kube_types.Pod { Status: &model.PodStatus{ Phase: string(obj.Status.Phase), }, - TotalCPU: uint(cpu.ScaledValue(api_resource.Milli)), - TotalMemory: uint(mem.Value() / 1024 / 1024), - Owner: owner, + ImagePullSecrets: getImagePullSecrets(obj.Spec.ImagePullSecrets), + TotalCPU: uint(cpu.ScaledValue(api_resource.Milli)), + TotalMemory: uint(mem.Value() / 1024 / 1024), + Owner: owner, } if parseforuser { diff --git a/pkg/model/secret.go b/pkg/model/secret.go index e611199c..32628671 100644 --- a/pkg/model/secret.go +++ b/pkg/model/secret.go @@ -13,22 +13,11 @@ import ( api_validation "k8s.io/apimachinery/pkg/util/validation" ) -// SecretWithParamList -- model for secrets list -// -// swagger:model -type SecretWithParamList struct { - Secrets []SecretWithParam `json:"secrets"` -} - // SecretWithParam -- model for secret with owner // // swagger:model -type SecretWithParam struct { - // swagger: allOf - *kube_types.Secret - //hide secret from users - Hidden bool `json:"hidden,omitempty"` -} + +type SecretKubeAPI kube_types.Secret const ( secretKind = "Secret" @@ -36,27 +25,25 @@ const ( ) // ParseKubeSecretList parses kubernetes v1.SecretList to more convenient []Secret struct. -func ParseKubeSecretList(secreti interface{}, parseforuser bool) (*SecretWithParamList, error) { +func ParseKubeSecretList(secreti interface{}, parseforuser bool) (*kube_types.SecretsList, error) { nativeSecrets := secreti.(*api_core.SecretList) if nativeSecrets == nil { return nil, ErrUnableConvertSecretList } - secrets := make([]SecretWithParam, 0) + secrets := make([]kube_types.Secret, 0) for _, secret := range nativeSecrets.Items { newSecret, err := ParseKubeSecret(&secret, parseforuser) if err != nil { return nil, err } - if !newSecret.Hidden || !parseforuser { - secrets = append(secrets, *newSecret) - } + secrets = append(secrets, *newSecret) } - return &SecretWithParamList{secrets}, nil + return &kube_types.SecretsList{secrets}, nil } // ParseKubeSecret parses kubernetes v1.Secret to more convenient Secret struct. -func ParseKubeSecret(secreti interface{}, parseforuser bool) (*SecretWithParam, error) { +func ParseKubeSecret(secreti interface{}, parseforuser bool) (*kube_types.Secret, error) { secret := secreti.(*api_core.Secret) if secret == nil { return nil, ErrUnableConvertSecret @@ -67,23 +54,23 @@ func ParseKubeSecret(secreti interface{}, parseforuser bool) (*SecretWithParam, newData[k] = string(v) } - newSecret := SecretWithParam{ - Secret: &kube_types.Secret{ - Name: secret.GetName(), - CreatedAt: secret.CreationTimestamp.UTC().Format(time.RFC3339), - Data: newData, - Owner: secret.GetObjectMeta().GetLabels()[ownerLabel], - }, + newSecret := kube_types.Secret{ + Name: secret.GetName(), + CreatedAt: secret.CreationTimestamp.UTC().Format(time.RFC3339), + Data: newData, + Owner: secret.GetObjectMeta().GetLabels()[ownerLabel], } - newSecret.ParseForUser() + if parseforuser { + newSecret.Mask() + } return &newSecret, nil } // ToKube creates kubernetes v1.Secret from Secret struct and namespace labels -func (secret *SecretWithParam) ToKube(nsName string, labels map[string]string) (*api_core.Secret, []error) { +func (secret *SecretKubeAPI) ToKube(nsName string, labels map[string]string, secretType api_core.SecretType) (*api_core.Secret, []error) { err := secret.Validate() if err != nil { return nil, err @@ -93,6 +80,10 @@ func (secret *SecretWithParam) ToKube(nsName string, labels map[string]string) ( return nil, []error{kubeErrors.ErrInternalError().AddDetails("invalid project labels")} } + if secretType == api_core.SecretTypeDockerConfigJson && secret.Data[".dockerconfigjson"] == "" { + return nil, []error{kubeErrors.ErrRequestValidationFailed().AddDetails("field '.dockerconfigjson' is required")} + } + newSecret := api_core.Secret{ TypeMeta: api_meta.TypeMeta{ Kind: secretKind, @@ -104,7 +95,7 @@ func (secret *SecretWithParam) ToKube(nsName string, labels map[string]string) ( Namespace: nsName, }, Data: makeSecretData(secret.Data), - Type: "Opaque", + Type: secretType, } return &newSecret, nil @@ -118,7 +109,7 @@ func makeSecretData(data map[string]string) map[string][]byte { return newData } -func (secret *SecretWithParam) Validate() []error { +func (secret *SecretKubeAPI) Validate() []error { var errs []error if secret.Name == "" { errs = append(errs, fmt.Errorf(fieldShouldExist, "name")) @@ -139,12 +130,3 @@ func (secret *SecretWithParam) Validate() []error { } return nil } - -// ParseForUser removes information not interesting for users -func (secret *SecretWithParam) ParseForUser() { - if secret.Owner == "" { - secret.Hidden = true - return - } - secret.Mask() -} diff --git a/pkg/router/handlers/secret.go b/pkg/router/handlers/secret.go index 52384649..19badac0 100644 --- a/pkg/router/handlers/secret.go +++ b/pkg/router/handlers/secret.go @@ -11,6 +11,7 @@ import ( "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" log "github.com/sirupsen/logrus" + api_core "k8s.io/api/core/v1" ) const ( @@ -18,7 +19,7 @@ const ( ) // swagger:operation GET /namespaces/{namespace}/secrets Secret GetSecretList -// Get secrets list. +// Get TLS secrets list. // // --- // x-method-visibility: public @@ -30,6 +31,10 @@ const ( // in: path // type: string // required: true +// - name: docker +// in: query +// type: string +// required: false // responses: // '200': // description: secrets list @@ -51,7 +56,14 @@ func GetSecretList(ctx *gin.Context) { return } - secrets, err := kube.GetSecretList(namespace) + _, isDocker := ctx.GetQuery("docker") + + var secrets *api_core.SecretList + if isDocker { + secrets, err = kube.GetDockerSecretList(namespace) + } else { + secrets, err = kube.GetTLSSecretList(namespace) + } if err != nil { gonic.Gonic(kubeErrors.ErrUnableGetResourcesList(), ctx) return @@ -125,7 +137,7 @@ func GetSecret(ctx *gin.Context) { ctx.JSON(http.StatusOK, ret) } -// swagger:operation POST /namespaces/{namespace}/secrets Secret CreateSecret +// swagger:operation POST /namespaces/{namespace}/secrets/tls Secret CreateTLSSecret // Create secret. // // --- @@ -149,7 +161,7 @@ func GetSecret(ctx *gin.Context) { // $ref: '#/definitions/SecretWithParam' // default: // $ref: '#/responses/error' -func CreateSecret(ctx *gin.Context) { +func CreateTLSSecret(ctx *gin.Context) { namespace := ctx.Param(namespaceParam) log.WithFields(log.Fields{ "Namespace": namespace, @@ -157,7 +169,7 @@ func CreateSecret(ctx *gin.Context) { kube := ctx.MustGet(m.KubeClient).(*kubernetes.Kube) - var secretReq model.SecretWithParam + var secretReq model.SecretKubeAPI if err := ctx.ShouldBindWith(&secretReq, binding.JSON); err != nil { ctx.Error(err) gonic.Gonic(kubeErrors.ErrRequestValidationFailed(), ctx) @@ -170,7 +182,73 @@ func CreateSecret(ctx *gin.Context) { return } - newSecret, errs := secretReq.ToKube(namespace, ns.Labels) + newSecret, errs := secretReq.ToKube(namespace, ns.Labels, api_core.SecretTypeOpaque) + if errs != nil { + gonic.Gonic(kubeErrors.ErrRequestValidationFailed().AddDetailsErr(errs...), ctx) + return + } + + secretAfter, err := kube.CreateSecret(newSecret) + if err != nil { + gonic.Gonic(model.ParseKubernetesResourceError(err, kubeErrors.ErrUnableCreateResource()), ctx) + return + } + + role := ctx.MustGet(m.UserRole).(string) + ret, err := model.ParseKubeSecret(secretAfter, role == m.RoleUser) + if err != nil { + ctx.Error(err) + } + + ctx.JSON(http.StatusCreated, ret) +} + +// swagger:operation POST /namespaces/{namespace}/secrets/docker Secret CreateDockerSecret +// Create secret. +// +// --- +// x-method-visibility: private +// parameters: +// - $ref: '#/parameters/UserIDHeader' +// - $ref: '#/parameters/UserRoleHeader' +// - $ref: '#/parameters/UserNamespaceHeader' +// - name: namespace +// in: path +// type: string +// required: true +// - name: body +// in: body +// schema: +// $ref: '#/definitions/SecretWithParam' +// responses: +// '201': +// description: secret created +// schema: +// $ref: '#/definitions/SecretWithParam' +// default: +// $ref: '#/responses/error' +func CreateDockerSecret(ctx *gin.Context) { + namespace := ctx.Param(namespaceParam) + log.WithFields(log.Fields{ + "Namespace": namespace, + }).Debug("Create secret Call") + + kube := ctx.MustGet(m.KubeClient).(*kubernetes.Kube) + + var secretReq model.SecretKubeAPI + if err := ctx.ShouldBindWith(&secretReq, binding.JSON); err != nil { + ctx.Error(err) + gonic.Gonic(kubeErrors.ErrRequestValidationFailed(), ctx) + return + } + + ns, err := kube.GetNamespaceQuota(namespace) + if err != nil { + gonic.Gonic(model.ParseKubernetesResourceError(err, kubeErrors.ErrUnableCreateResource()), ctx) + return + } + + newSecret, errs := secretReq.ToKube(namespace, ns.Labels, api_core.SecretTypeDockerConfigJson) if errs != nil { gonic.Gonic(kubeErrors.ErrRequestValidationFailed().AddDetailsErr(errs...), ctx) return @@ -208,6 +286,10 @@ func CreateSecret(ctx *gin.Context) { // in: path // type: string // required: true +// - name: docker +// in: query +// type: string +// required: false // - name: body // in: body // schema: @@ -225,11 +307,11 @@ func UpdateSecret(ctx *gin.Context) { log.WithFields(log.Fields{ "Namespace": namespace, "Secret": sct, - }).Debug("Create secret Call") + }).Debug("Update secret Call") kube := ctx.MustGet(m.KubeClient).(*kubernetes.Kube) - var secretReq model.SecretWithParam + var secretReq model.SecretKubeAPI if err := ctx.ShouldBindWith(&secretReq, binding.JSON); err != nil { ctx.Error(err) gonic.Gonic(kubeErrors.ErrRequestValidationFailed(), ctx) @@ -242,7 +324,7 @@ func UpdateSecret(ctx *gin.Context) { return } - oldSecret, err := kube.GetIngress(namespace, sct) + oldSecret, err := kube.GetSecret(namespace, sct) if err != nil { gonic.Gonic(model.ParseKubernetesResourceError(err, kubeErrors.ErrUnableUpdateResource()), ctx) return @@ -251,7 +333,15 @@ func UpdateSecret(ctx *gin.Context) { secretReq.Name = sct secretReq.Owner = oldSecret.GetObjectMeta().GetLabels()[ownerQuery] - newSecret, errs := secretReq.ToKube(namespace, ns.Labels) + _, isDocker := ctx.GetQuery("docker") + + var newSecret *api_core.Secret + var errs []error + if isDocker { + newSecret, errs = secretReq.ToKube(namespace, ns.Labels, api_core.SecretTypeDockerConfigJson) + } else { + newSecret, errs = secretReq.ToKube(namespace, ns.Labels, api_core.SecretTypeOpaque) + } if errs != nil { gonic.Gonic(kubeErrors.ErrRequestValidationFailed().AddDetailsErr(errs...), ctx) return diff --git a/pkg/router/router.go b/pkg/router/router.go index cb8c7142..5d2a37ec 100644 --- a/pkg/router/router.go +++ b/pkg/router/router.go @@ -95,7 +95,8 @@ func initRoutes(e gin.IRouter) { { secret.GET("", m.ReadAccess, h.GetSecretList) secret.GET("/:secret", m.ReadAccess, h.GetSecret) - secret.POST("", m.WriteAccess, h.CreateSecret) + secret.POST("/tls", m.WriteAccess, h.CreateTLSSecret) + secret.POST("/docker", m.WriteAccess, h.CreateDockerSecret) secret.PUT("/:secret", m.WriteAccess, h.UpdateSecret) secret.DELETE("/:secret", m.DeleteAccess, h.DeleteSecret) } diff --git a/vendor/github.com/containerum/kube-client/pkg/model/configmap.go b/vendor/github.com/containerum/kube-client/pkg/model/configmap.go index 98e6a1e7..0e8126fb 100644 --- a/vendor/github.com/containerum/kube-client/pkg/model/configmap.go +++ b/vendor/github.com/containerum/kube-client/pkg/model/configmap.go @@ -18,8 +18,9 @@ type ConfigMap struct { // key-value data // // required: true - Data ConfigMapData `json:"data" yaml:"data"` - Owner string `json:"owner,omitempty" yaml:"owner,omitempty"` + Data ConfigMapData `json:"data" yaml:"data"` + Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` + Owner string `json:"owner,omitempty" yaml:"owner,omitempty"` } // SelectedConfigMapsList -- model for config maps list from all namespaces diff --git a/vendor/github.com/containerum/kube-client/pkg/model/deployment.go b/vendor/github.com/containerum/kube-client/pkg/model/deployment.go index 3a78e7cc..f6756ea4 100644 --- a/vendor/github.com/containerum/kube-client/pkg/model/deployment.go +++ b/vendor/github.com/containerum/kube-client/pkg/model/deployment.go @@ -54,7 +54,8 @@ type Deployment struct { // required: true Name string `json:"name" yaml:"name"` // required: true - Replicas int `json:"replicas" yaml:"replicas"` + Replicas int `json:"replicas" yaml:"replicas"` + ImagePullSecrets []string `json:"image_pull_secret,omitempty"` //total CPU usage by all containers in this deployment TotalCPU uint `json:"total_cpu,omitempty" yaml:"total_cpu,omitempty"` //total RAM usage by all containers in this deployment diff --git a/vendor/github.com/containerum/kube-client/pkg/model/group.go b/vendor/github.com/containerum/kube-client/pkg/model/group.go index 3bb6b802..d76334a0 100644 --- a/vendor/github.com/containerum/kube-client/pkg/model/group.go +++ b/vendor/github.com/containerum/kube-client/pkg/model/group.go @@ -27,8 +27,8 @@ type UserGroup struct { OwnerID string `json:"owner_user_id,omitempty"` OwnerLogin string `json:"owner_login,omitempty"` *UserGroupMembers - MembersCount uint `json:"members_count,omitempty"` - UserAccess UserGroupAccess `json:"access,omitempty"` + MembersCount uint `json:"members_count,omitempty"` + UserAccess AccessLevel `json:"access,omitempty"` //creation date in RFC3339 format CreatedAt string `json:"created_at,omitempty"` } @@ -44,7 +44,7 @@ type UserGroupMembers struct { // // swagger:model type UserGroupMember struct { - ID string `json:"id,omitempty"` - Username string `json:"username"` - Access UserGroupAccess `json:"access"` + ID string `json:"id,omitempty"` + Username string `json:"username"` + Access AccessLevel `json:"access"` } diff --git a/vendor/github.com/containerum/kube-client/pkg/model/ingress.go b/vendor/github.com/containerum/kube-client/pkg/model/ingress.go index 17ddd110..494cb8a6 100644 --- a/vendor/github.com/containerum/kube-client/pkg/model/ingress.go +++ b/vendor/github.com/containerum/kube-client/pkg/model/ingress.go @@ -23,8 +23,9 @@ type Ingress struct { //delete date in RFC3339 format DeletedAt string `json:"deleted_at,omitempty" yaml:"deleted_at,omitempty"` // required: true - Rules []Rule `json:"rules" yaml:"rules"` - Owner string `json:"owner,omitempty" yaml:"owner,omitempty"` + Rules []Rule `json:"rules" yaml:"rules"` + Namespace string `json:"namespace,omitempty" yaml:"namespace,omitempty"` + Owner string `json:"owner,omitempty" yaml:"owner,omitempty"` } // Rule -- ingress rule diff --git a/vendor/github.com/containerum/kube-client/pkg/model/pod.go b/vendor/github.com/containerum/kube-client/pkg/model/pod.go index 11d1cf39..09485354 100644 --- a/vendor/github.com/containerum/kube-client/pkg/model/pod.go +++ b/vendor/github.com/containerum/kube-client/pkg/model/pod.go @@ -12,13 +12,13 @@ type PodsList struct { // swagger:model type Pod struct { //creation date in RFC3339 format - CreatedAt *string `json:"created_at,omitempty"` - Name string `json:"name"` - Owner string `json:"owner"` - Containers []Container `json:"containers"` - ImagePullSecret *map[string]string `json:"image_pull_secret,omitempty"` - Status *PodStatus `json:"status,omitempty"` - Deploy *string `json:"deploy,omitempty"` + CreatedAt *string `json:"created_at,omitempty"` + Name string `json:"name"` + Owner string `json:"owner"` + Containers []Container `json:"containers"` + ImagePullSecrets []string `json:"image_pull_secret,omitempty"` + Status *PodStatus `json:"status,omitempty"` + Deploy *string `json:"deploy,omitempty"` //total CPU usage by all containers in this pod TotalCPU uint `json:"total_cpu,omitempty"` //total RAM usage by all containers in this pod diff --git a/vendor/github.com/imdario/mergo/merge.go b/vendor/github.com/imdario/mergo/merge.go index 706b2206..44f70a89 100644 --- a/vendor/github.com/imdario/mergo/merge.go +++ b/vendor/github.com/imdario/mergo/merge.go @@ -9,6 +9,7 @@ package mergo import ( + "fmt" "reflect" ) @@ -127,6 +128,9 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co if !isEmptyValue(src) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { dstSlice = srcSlice } else if config.AppendSlice { + if srcSlice.Type() != dstSlice.Type() { + return fmt.Errorf("cannot append two slice with different type (%s, %s)", srcSlice.Type(), dstSlice.Type()) + } dstSlice = reflect.AppendSlice(dstSlice, srcSlice) } dst.SetMapIndex(key, dstSlice) @@ -150,6 +154,9 @@ func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, co if !isEmptyValue(src) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { dst.Set(src) } else if config.AppendSlice { + if src.Type() != dst.Type() { + return fmt.Errorf("cannot append two slice with different type (%s, %s)", src.Type(), dst.Type()) + } dst.Set(reflect.AppendSlice(dst, src)) } case reflect.Ptr: diff --git a/vendor/github.com/mailru/easyjson/jlexer/lexer.go b/vendor/github.com/mailru/easyjson/jlexer/lexer.go index 90525e66..51f05661 100644 --- a/vendor/github.com/mailru/easyjson/jlexer/lexer.go +++ b/vendor/github.com/mailru/easyjson/jlexer/lexer.go @@ -240,7 +240,7 @@ func (r *Lexer) fetchNumber() { // findStringLen tries to scan into the string literal for ending quote char to determine required size. // The size will be exact if no escapes are present and may be inexact if there are escaped chars. -func findStringLen(data []byte) (hasEscapes bool, length int) { +func findStringLen(data []byte) (isValid, hasEscapes bool, length int) { delta := 0 for i := 0; i < len(data); i++ { @@ -252,11 +252,11 @@ func findStringLen(data []byte) (hasEscapes bool, length int) { delta++ } case '"': - return (delta > 0), (i - delta) + return true, (delta > 0), (i - delta) } } - return false, len(data) + return false, false, len(data) } // getu4 decodes \uXXXX from the beginning of s, returning the hex value, @@ -342,7 +342,12 @@ func (r *Lexer) fetchString() { r.pos++ data := r.Data[r.pos:] - hasEscapes, length := findStringLen(data) + isValid, hasEscapes, length := findStringLen(data) + if !isValid { + r.pos += length + r.errParse("unterminated string literal") + return + } if !hasEscapes { r.token.byteValue = data[:length] r.pos += length + 1 diff --git a/vendor/github.com/sirupsen/logrus/entry.go b/vendor/github.com/sirupsen/logrus/entry.go index 778f4c9f..473bd1a0 100644 --- a/vendor/github.com/sirupsen/logrus/entry.go +++ b/vendor/github.com/sirupsen/logrus/entry.go @@ -48,7 +48,7 @@ type Entry struct { func NewEntry(logger *Logger) *Entry { return &Entry{ Logger: logger, - // Default is three fields, give a little extra room + // Default is five fields, give a little extra room Data: make(Fields, 5), } } @@ -83,14 +83,28 @@ func (entry *Entry) WithFields(fields Fields) *Entry { for k, v := range fields { data[k] = v } - return &Entry{Logger: entry.Logger, Data: data} + return &Entry{Logger: entry.Logger, Data: data, Time: entry.Time} +} + +// Overrides the time of the Entry. +func (entry *Entry) WithTime(t time.Time) *Entry { + return &Entry{Logger: entry.Logger, Data: entry.Data, Time: t} } // This function is not declared with a pointer value because otherwise // race conditions will occur when using multiple goroutines func (entry Entry) log(level Level, msg string) { var buffer *bytes.Buffer - entry.Time = time.Now() + + // Default to now, but allow users to override if they want. + // + // We don't have to worry about polluting future calls to Entry#log() + // with this assignment because this function is declared with a + // non-pointer receiver. + if entry.Time.IsZero() { + entry.Time = time.Now() + } + entry.Level = level entry.Message = msg @@ -113,12 +127,10 @@ func (entry Entry) log(level Level, msg string) { } } -// This function is not declared with a pointer value because otherwise -// race conditions will occur when using multiple goroutines -func (entry Entry) fireHooks() { +func (entry *Entry) fireHooks() { entry.Logger.mu.Lock() defer entry.Logger.mu.Unlock() - err := entry.Logger.Hooks.Fire(entry.Level, &entry) + err := entry.Logger.Hooks.Fire(entry.Level, entry) if err != nil { fmt.Fprintf(os.Stderr, "Failed to fire hook: %v\n", err) } diff --git a/vendor/github.com/sirupsen/logrus/exported.go b/vendor/github.com/sirupsen/logrus/exported.go index 013183ed..eb612a6f 100644 --- a/vendor/github.com/sirupsen/logrus/exported.go +++ b/vendor/github.com/sirupsen/logrus/exported.go @@ -2,6 +2,7 @@ package logrus import ( "io" + "time" ) var ( @@ -15,9 +16,7 @@ func StandardLogger() *Logger { // SetOutput sets the standard logger output. func SetOutput(out io.Writer) { - std.mu.Lock() - defer std.mu.Unlock() - std.Out = out + std.SetOutput(out) } // SetFormatter sets the standard logger formatter. @@ -72,6 +71,15 @@ func WithFields(fields Fields) *Entry { return std.WithFields(fields) } +// WithTime creats an entry from the standard logger and overrides the time of +// logs generated with it. +// +// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal +// or Panic on the Entry it returns. +func WithTime(t time.Time) *Entry { + return std.WithTime(t) +} + // Debug logs a message at level Debug on the standard logger. func Debug(args ...interface{}) { std.Debug(args...) @@ -107,7 +115,7 @@ func Panic(args ...interface{}) { std.Panic(args...) } -// Fatal logs a message at level Fatal on the standard logger. +// Fatal logs a message at level Fatal on the standard logger then the process will exit with status set to 1. func Fatal(args ...interface{}) { std.Fatal(args...) } @@ -147,7 +155,7 @@ func Panicf(format string, args ...interface{}) { std.Panicf(format, args...) } -// Fatalf logs a message at level Fatal on the standard logger. +// Fatalf logs a message at level Fatal on the standard logger then the process will exit with status set to 1. func Fatalf(format string, args ...interface{}) { std.Fatalf(format, args...) } @@ -187,7 +195,7 @@ func Panicln(args ...interface{}) { std.Panicln(args...) } -// Fatalln logs a message at level Fatal on the standard logger. +// Fatalln logs a message at level Fatal on the standard logger then the process will exit with status set to 1. func Fatalln(args ...interface{}) { std.Fatalln(args...) } diff --git a/vendor/github.com/sirupsen/logrus/formatter.go b/vendor/github.com/sirupsen/logrus/formatter.go index b183ff5b..83c74947 100644 --- a/vendor/github.com/sirupsen/logrus/formatter.go +++ b/vendor/github.com/sirupsen/logrus/formatter.go @@ -30,16 +30,22 @@ type Formatter interface { // // It's not exported because it's still using Data in an opinionated way. It's to // avoid code duplication between the two default formatters. -func prefixFieldClashes(data Fields) { - if t, ok := data["time"]; ok { - data["fields.time"] = t +func prefixFieldClashes(data Fields, fieldMap FieldMap) { + timeKey := fieldMap.resolve(FieldKeyTime) + if t, ok := data[timeKey]; ok { + data["fields."+timeKey] = t + delete(data, timeKey) } - if m, ok := data["msg"]; ok { - data["fields.msg"] = m + msgKey := fieldMap.resolve(FieldKeyMsg) + if m, ok := data[msgKey]; ok { + data["fields."+msgKey] = m + delete(data, msgKey) } - if l, ok := data["level"]; ok { - data["fields.level"] = l + levelKey := fieldMap.resolve(FieldKeyLevel) + if l, ok := data[levelKey]; ok { + data["fields."+levelKey] = l + delete(data, levelKey) } } diff --git a/vendor/github.com/sirupsen/logrus/json_formatter.go b/vendor/github.com/sirupsen/logrus/json_formatter.go index fb01c1b1..dab17610 100644 --- a/vendor/github.com/sirupsen/logrus/json_formatter.go +++ b/vendor/github.com/sirupsen/logrus/json_formatter.go @@ -33,6 +33,9 @@ type JSONFormatter struct { // DisableTimestamp allows disabling automatic timestamps in output DisableTimestamp bool + // DataKey allows users to put all the log entry parameters into a nested dictionary at a given key. + DataKey string + // FieldMap allows users to customize the names of keys for default fields. // As an example: // formatter := &JSONFormatter{ @@ -58,7 +61,14 @@ func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) { data[k] = v } } - prefixFieldClashes(data) + + if f.DataKey != "" { + newData := make(Fields, 4) + newData[f.DataKey] = data + data = newData + } + + prefixFieldClashes(data, f.FieldMap) timestampFormat := f.TimestampFormat if timestampFormat == "" { diff --git a/vendor/github.com/sirupsen/logrus/logger.go b/vendor/github.com/sirupsen/logrus/logger.go index fdaf8a65..342f7977 100644 --- a/vendor/github.com/sirupsen/logrus/logger.go +++ b/vendor/github.com/sirupsen/logrus/logger.go @@ -5,6 +5,7 @@ import ( "os" "sync" "sync/atomic" + "time" ) type Logger struct { @@ -88,7 +89,7 @@ func (logger *Logger) releaseEntry(entry *Entry) { } // Adds a field to the log entry, note that it doesn't log until you call -// Debug, Print, Info, Warn, Fatal or Panic. It only creates a log entry. +// Debug, Print, Info, Warn, Error, Fatal or Panic. It only creates a log entry. // If you want multiple fields, use `WithFields`. func (logger *Logger) WithField(key string, value interface{}) *Entry { entry := logger.newEntry() @@ -112,6 +113,13 @@ func (logger *Logger) WithError(err error) *Entry { return entry.WithError(err) } +// Overrides the time of the log entry. +func (logger *Logger) WithTime(t time.Time) *Entry { + entry := logger.newEntry() + defer logger.releaseEntry(entry) + return entry.WithTime(t) +} + func (logger *Logger) Debugf(format string, args ...interface{}) { if logger.level() >= DebugLevel { entry := logger.newEntry() @@ -316,6 +324,12 @@ func (logger *Logger) SetLevel(level Level) { atomic.StoreUint32((*uint32)(&logger.Level), uint32(level)) } +func (logger *Logger) SetOutput(out io.Writer) { + logger.mu.Lock() + defer logger.mu.Unlock() + logger.Out = out +} + func (logger *Logger) AddHook(hook Hook) { logger.mu.Lock() defer logger.mu.Unlock() diff --git a/vendor/github.com/sirupsen/logrus/text_formatter.go b/vendor/github.com/sirupsen/logrus/text_formatter.go index 61b21cae..3e550403 100644 --- a/vendor/github.com/sirupsen/logrus/text_formatter.go +++ b/vendor/github.com/sirupsen/logrus/text_formatter.go @@ -20,6 +20,7 @@ const ( var ( baseTimestamp time.Time + emptyFieldMap FieldMap ) func init() { @@ -50,12 +51,24 @@ type TextFormatter struct { // be desired. DisableSorting bool + // Disables the truncation of the level text to 4 characters. + DisableLevelTruncation bool + // QuoteEmptyFields will wrap empty fields in quotes if true QuoteEmptyFields bool // Whether the logger's out is to a terminal isTerminal bool + // FieldMap allows users to customize the names of keys for default fields. + // As an example: + // formatter := &TextFormatter{ + // FieldMap: FieldMap{ + // FieldKeyTime: "@timestamp", + // FieldKeyLevel: "@level", + // FieldKeyMsg: "@message"}} + FieldMap FieldMap + sync.Once } @@ -67,7 +80,8 @@ func (f *TextFormatter) init(entry *Entry) { // Format renders a single log entry func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { - var b *bytes.Buffer + prefixFieldClashes(entry.Data, f.FieldMap) + keys := make([]string, 0, len(entry.Data)) for k := range entry.Data { keys = append(keys, k) @@ -76,14 +90,14 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { if !f.DisableSorting { sort.Strings(keys) } + + var b *bytes.Buffer if entry.Buffer != nil { b = entry.Buffer } else { b = &bytes.Buffer{} } - prefixFieldClashes(entry.Data) - f.Do(func() { f.init(entry) }) isColored := (f.ForceColors || f.isTerminal) && !f.DisableColors @@ -96,11 +110,11 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { f.printColored(b, entry, keys, timestampFormat) } else { if !f.DisableTimestamp { - f.appendKeyValue(b, "time", entry.Time.Format(timestampFormat)) + f.appendKeyValue(b, f.FieldMap.resolve(FieldKeyTime), entry.Time.Format(timestampFormat)) } - f.appendKeyValue(b, "level", entry.Level.String()) + f.appendKeyValue(b, f.FieldMap.resolve(FieldKeyLevel), entry.Level.String()) if entry.Message != "" { - f.appendKeyValue(b, "msg", entry.Message) + f.appendKeyValue(b, f.FieldMap.resolve(FieldKeyMsg), entry.Message) } for _, key := range keys { f.appendKeyValue(b, key, entry.Data[key]) @@ -124,7 +138,10 @@ func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []strin levelColor = blue } - levelText := strings.ToUpper(entry.Level.String())[0:4] + levelText := strings.ToUpper(entry.Level.String()) + if !f.DisableLevelTruncation { + levelText = levelText[0:4] + } if f.DisableTimestamp { fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m %-44s ", levelColor, levelText, entry.Message) diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go index e3250077..c85e31f2 100644 --- a/vendor/golang.org/x/net/http2/frame.go +++ b/vendor/golang.org/x/net/http2/frame.go @@ -733,32 +733,67 @@ func (f *SettingsFrame) IsAck() bool { return f.FrameHeader.Flags.Has(FlagSettingsAck) } -func (f *SettingsFrame) Value(s SettingID) (v uint32, ok bool) { +func (f *SettingsFrame) Value(id SettingID) (v uint32, ok bool) { f.checkValid() - buf := f.p - for len(buf) > 0 { - settingID := SettingID(binary.BigEndian.Uint16(buf[:2])) - if settingID == s { - return binary.BigEndian.Uint32(buf[2:6]), true + for i := 0; i < f.NumSettings(); i++ { + if s := f.Setting(i); s.ID == id { + return s.Val, true } - buf = buf[6:] } return 0, false } +// Setting returns the setting from the frame at the given 0-based index. +// The index must be >= 0 and less than f.NumSettings(). +func (f *SettingsFrame) Setting(i int) Setting { + buf := f.p + return Setting{ + ID: SettingID(binary.BigEndian.Uint16(buf[i*6 : i*6+2])), + Val: binary.BigEndian.Uint32(buf[i*6+2 : i*6+6]), + } +} + +func (f *SettingsFrame) NumSettings() int { return len(f.p) / 6 } + +// HasDuplicates reports whether f contains any duplicate setting IDs. +func (f *SettingsFrame) HasDuplicates() bool { + num := f.NumSettings() + if num == 0 { + return false + } + // If it's small enough (the common case), just do the n^2 + // thing and avoid a map allocation. + if num < 10 { + for i := 0; i < num; i++ { + idi := f.Setting(i).ID + for j := i + 1; j < num; j++ { + idj := f.Setting(j).ID + if idi == idj { + return true + } + } + } + return false + } + seen := map[SettingID]bool{} + for i := 0; i < num; i++ { + id := f.Setting(i).ID + if seen[id] { + return true + } + seen[id] = true + } + return false +} + // ForeachSetting runs fn for each setting. // It stops and returns the first error. func (f *SettingsFrame) ForeachSetting(fn func(Setting) error) error { f.checkValid() - buf := f.p - for len(buf) > 0 { - if err := fn(Setting{ - SettingID(binary.BigEndian.Uint16(buf[:2])), - binary.BigEndian.Uint32(buf[2:6]), - }); err != nil { + for i := 0; i < f.NumSettings(); i++ { + if err := fn(f.Setting(i)); err != nil { return err } - buf = buf[6:] } return nil } diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index 6e2c5b92..22cb18e0 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -1487,6 +1487,12 @@ func (sc *serverConn) processSettings(f *SettingsFrame) error { } return nil } + if f.NumSettings() > 100 || f.HasDuplicates() { + // This isn't actually in the spec, but hang up on + // suspiciously large settings frames or those with + // duplicate entries. + return ConnectionError(ErrCodeProtocol) + } if err := f.ForeachSetting(sc.processSetting); err != nil { return err } diff --git a/vendor/golang.org/x/sys/unix/ioctl.go b/vendor/golang.org/x/sys/unix/ioctl.go new file mode 100644 index 00000000..8c9aaeb2 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/ioctl.go @@ -0,0 +1,30 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +import "runtime" + +// IoctlSetWinsize performs an ioctl on fd with a *Winsize argument. +// +// To change fd's window size, the req argument should be TIOCSWINSZ. +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + // TODO: if we get the chance, remove the req parameter and + // hardcode TIOCSWINSZ. + err := ioctlSetWinsize(fd, req, value) + runtime.KeepAlive(value) + return err +} + +// IoctlSetTermios performs an ioctl on fd with a *Termios. +// +// The req value will usually be TCSETA or TIOCSETA. +func IoctlSetTermios(fd int, req uint, value *Termios) error { + // TODO: if we get the chance, remove the req parameter. + err := ioctlSetTermios(fd, req, value) + runtime.KeepAlive(value) + return err +} diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index 79e94767..166ac0b5 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -313,11 +313,11 @@ func IoctlSetInt(fd int, req uint, value int) error { return ioctl(fd, req, uintptr(value)) } -func IoctlSetWinsize(fd int, req uint, value *Winsize) error { +func ioctlSetWinsize(fd int, req uint, value *Winsize) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } -func IoctlSetTermios(fd int, req uint, value *Termios) error { +func ioctlSetTermios(fd int, req uint, value *Termios) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go index e34abe29..79d125b3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -143,11 +143,11 @@ func IoctlSetInt(fd int, req uint, value int) error { return ioctl(fd, req, uintptr(value)) } -func IoctlSetWinsize(fd int, req uint, value *Winsize) error { +func ioctlSetWinsize(fd int, req uint, value *Winsize) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } -func IoctlSetTermios(fd int, req uint, value *Termios) error { +func ioctlSetTermios(fd int, req uint, value *Termios) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go index 5561a3eb..063c0312 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -364,11 +364,11 @@ func IoctlSetInt(fd int, req uint, value int) error { return ioctl(fd, req, uintptr(value)) } -func IoctlSetWinsize(fd int, req uint, value *Winsize) error { +func ioctlSetWinsize(fd int, req uint, value *Winsize) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } -func IoctlSetTermios(fd int, req uint, value *Termios) error { +func ioctlSetTermios(fd int, req uint, value *Termios) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 690c2c87..712d1726 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -61,11 +61,11 @@ func IoctlSetInt(fd int, req uint, value int) error { return ioctl(fd, req, uintptr(value)) } -func IoctlSetWinsize(fd int, req uint, value *Winsize) error { +func ioctlSetWinsize(fd int, req uint, value *Winsize) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } -func IoctlSetTermios(fd int, req uint, value *Termios) error { +func ioctlSetTermios(fd int, req uint, value *Termios) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } @@ -1415,10 +1415,70 @@ func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) { func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { if flags & ^(AT_SYMLINK_NOFOLLOW|AT_EACCESS) != 0 { return EINVAL - } else if flags&(AT_SYMLINK_NOFOLLOW|AT_EACCESS) != 0 { - return EOPNOTSUPP } - return faccessat(dirfd, path, mode) + + // The Linux kernel faccessat system call does not take any flags. + // The glibc faccessat implements the flags itself; see + // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/faccessat.c;hb=HEAD + // Because people naturally expect syscall.Faccessat to act + // like C faccessat, we do the same. + + if flags == 0 { + return faccessat(dirfd, path, mode) + } + + var st Stat_t + if err := Fstatat(dirfd, path, &st, flags&AT_SYMLINK_NOFOLLOW); err != nil { + return err + } + + mode &= 7 + if mode == 0 { + return nil + } + + var uid int + if flags&AT_EACCESS != 0 { + uid = Geteuid() + } else { + uid = Getuid() + } + + if uid == 0 { + if mode&1 == 0 { + // Root can read and write any file. + return nil + } + if st.Mode&0111 != 0 { + // Root can execute any file that anybody can execute. + return nil + } + return EACCES + } + + var fmode uint32 + if uint32(uid) == st.Uid { + fmode = (st.Mode >> 6) & 7 + } else { + var gid int + if flags&AT_EACCESS != 0 { + gid = Getegid() + } else { + gid = Getgid() + } + + if uint32(gid) == st.Gid { + fmode = (st.Mode >> 3) & 7 + } else { + fmode = st.Mode & 7 + } + } + + if fmode&mode == mode { + return nil + } + + return EACCES } /* diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go index 0e059248..99e0e999 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -124,14 +124,13 @@ func Pipe2(p []int, flags int) (err error) { return } +//sysnb pipe() (p1 int, p2 int, err error) + func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } - var pp [2]_C_int - err = pipe2(&pp, 0) - p[0] = int(pp[0]) - p[1] = int(pp[1]) + p[0], p[1], err = pipe() return } diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 369a2be2..71bb0925 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -145,11 +145,11 @@ func IoctlSetInt(fd int, req uint, value int) error { return ioctl(fd, req, uintptr(value)) } -func IoctlSetWinsize(fd int, req uint, value *Winsize) error { +func ioctlSetWinsize(fd int, req uint, value *Winsize) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } -func IoctlSetTermios(fd int, req uint, value *Termios) error { +func ioctlSetTermios(fd int, req uint, value *Termios) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index 9fc9c06a..07e6669c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -113,11 +113,11 @@ func IoctlSetInt(fd int, req uint, value int) error { return ioctl(fd, req, uintptr(value)) } -func IoctlSetWinsize(fd int, req uint, value *Winsize) error { +func ioctlSetWinsize(fd int, req uint, value *Winsize) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } -func IoctlSetTermios(fd int, req uint, value *Termios) error { +func ioctlSetTermios(fd int, req uint, value *Termios) error { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index a05337d5..53b80782 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -540,11 +540,11 @@ func IoctlSetInt(fd int, req uint, value int) (err error) { return ioctl(fd, req, uintptr(value)) } -func IoctlSetWinsize(fd int, req uint, value *Winsize) (err error) { +func ioctlSetWinsize(fd int, req uint, value *Winsize) (err error) { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } -func IoctlSetTermios(fd int, req uint, value *Termios) (err error) { +func ioctlSetTermios(fd int, req uint, value *Termios) (err error) { return ioctl(fd, req, uintptr(unsafe.Pointer(value))) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index e7617052..ac3b8f8c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -2137,6 +2137,18 @@ func pipe2(p *[2]_C_int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func pipe() (p1 int, p2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + p1 = int(r0) + p2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) xaddr = uintptr(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index f6e45189..62a71ad8 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -2137,6 +2137,18 @@ func pipe2(p *[2]_C_int, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func pipe() (p1 int, p2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + p1 = int(r0) + p2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) xaddr = uintptr(r0) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 4c250033..9d6dd8af 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -1852,3 +1852,25 @@ type RTCPLLInfo struct { Negmult int32 Clock int32 } + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 +} + +const ( + BLKPG = 0x1269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index 2e4d709b..31cde89d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -1872,3 +1872,27 @@ type RTCPLLInfo struct { Negmult int32 Clock int64 } + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + _ [4]byte + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x1269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index bf38e5e2..5d17feee 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -1841,3 +1841,26 @@ type RTCPLLInfo struct { Negmult int32 Clock int32 } + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x1269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 972c1b87..a4eaf103 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -1851,3 +1851,27 @@ type RTCPLLInfo struct { Negmult int32 Clock int64 } + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + _ [4]byte + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x1269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index 783e70e8..614d9856 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -1846,3 +1846,26 @@ type RTCPLLInfo struct { Negmult int32 Clock int32 } + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x20001269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 5c6ea719..f609deab 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -1853,3 +1853,27 @@ type RTCPLLInfo struct { Negmult int32 Clock int64 } + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + _ [4]byte + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x20001269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 93effc8e..a9cb3d27 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -1853,3 +1853,27 @@ type RTCPLLInfo struct { Negmult int32 Clock int64 } + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + _ [4]byte + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x20001269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index cc5ca242..fcb28a1b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -1846,3 +1846,26 @@ type RTCPLLInfo struct { Negmult int32 Clock int32 } + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x20001269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 712f6402..0b4066d2 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -1861,3 +1861,27 @@ type RTCPLLInfo struct { Negmult int32 Clock int64 } + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + _ [4]byte + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x20001269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 1be45320..46ff7330 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -1861,3 +1861,27 @@ type RTCPLLInfo struct { Negmult int32 Clock int64 } + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + _ [4]byte + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x20001269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index 932b655f..973463d2 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -1878,3 +1878,27 @@ type RTCPLLInfo struct { Negmult int32 Clock int64 } + +type BlkpgIoctlArg struct { + Op int32 + Flags int32 + Datalen int32 + _ [4]byte + Data *byte +} + +type BlkpgPartition struct { + Start int64 + Length int64 + Pno int32 + Devname [64]uint8 + Volname [64]uint8 + _ [4]byte +} + +const ( + BLKPG = 0x1269 + BLKPG_ADD_PARTITION = 0x1 + BLKPG_DEL_PARTITION = 0x2 + BLKPG_RESIZE_PARTITION = 0x3 +) diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 1e9f4bb4..fd89e08e 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -112,12 +112,14 @@ func Getpagesize() int { return 4096 } // NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention. // This is useful when interoperating with Windows code requiring callbacks. +// The argument is expected to be a function with with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. func NewCallback(fn interface{}) uintptr { return syscall.NewCallback(fn) } // NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention. // This is useful when interoperating with Windows code requiring callbacks. +// The argument is expected to be a function with with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. func NewCallbackCDecl(fn interface{}) uintptr { return syscall.NewCallbackCDecl(fn) } From c4ba590fd3749375fb952e012d05dcac98dcad00 Mon Sep 17 00:00:00 2001 From: Ilia Donchenko Date: Tue, 31 Jul 2018 13:16:51 +0300 Subject: [PATCH 3/4] fix get configmaps list --- pkg/kubernetes/configmap.go | 2 +- static/ab0x.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/kubernetes/configmap.go b/pkg/kubernetes/configmap.go index b1a40951..61977fdc 100644 --- a/pkg/kubernetes/configmap.go +++ b/pkg/kubernetes/configmap.go @@ -8,7 +8,7 @@ import ( //GetConfigMapList returns config maps list func (k *Kube) GetConfigMapList(namespace string) (*api_core.ConfigMapList, error) { - cmAfter, err := k.CoreV1().ConfigMaps("").List(api_meta.ListOptions{}) + cmAfter, err := k.CoreV1().ConfigMaps(namespace).List(api_meta.ListOptions{}) if err != nil { log.WithFields(log.Fields{ "Namespace": namespace, diff --git a/static/ab0x.go b/static/ab0x.go index 40a803e9..adea9f7a 100644 --- a/static/ab0x.go +++ b/static/ab0x.go @@ -1,5 +1,5 @@ -// Code generated by fileb0x at "2018-07-18 13:32:06.926167072 +0300 MSK m=+0.034695138" from config file "b0x.yaml" DO NOT EDIT. -// modification hash(7e0874aeddc5ae5f38b40f40acea1f4a.609e421ba501f0920d8a2e508dbc3a3c) +// Code generated by fileb0x at "2018-07-31 13:09:43.142563774 +0300 MSK m=+0.032835028" from config file "b0x.yaml" DO NOT EDIT. +// modification hash(849a634b69dd248f1489fa6188c54365.609e421ba501f0920d8a2e508dbc3a3c) package static From fc6d4d2d1ead1d199958ebce66657ce6fbc1bbce Mon Sep 17 00:00:00 2001 From: Ilia Donchenko Date: Wed, 1 Aug 2018 09:33:42 +0300 Subject: [PATCH 4/4] Fix create container error --- pkg/model/deployment.go | 4 ++-- pkg/model/service.go | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/model/deployment.go b/pkg/model/deployment.go index 9059f4f4..541e0072 100644 --- a/pkg/model/deployment.go +++ b/pkg/model/deployment.go @@ -213,7 +213,7 @@ func (deploy *DeploymentKubeAPI) ToKube(nsName string, labels map[string]string) func makeContainers(containers []kube_types.Container) ([]api_core.Container, []error) { containersAfter := make([]api_core.Container, len(containers)) - for _, c := range containers { + for i, c := range containers { errs := validateContainer(c, c.Limits.CPU, c.Limits.Memory) if errs != nil { return nil, errs @@ -241,7 +241,7 @@ func makeContainers(containers []kube_types.Container) ([]api_core.Container, [] container.Resources = *rq - containersAfter = append(containersAfter, container) + containersAfter[i] = container } return containersAfter, nil } diff --git a/pkg/model/service.go b/pkg/model/service.go index 9d76d925..fc22522f 100644 --- a/pkg/model/service.go +++ b/pkg/model/service.go @@ -168,16 +168,16 @@ func (service *ServiceWithParam) ToKube(nsName string, labels map[string]string) func makeServicePorts(ports []kube_types.ServicePort) []api_core.ServicePort { serviceports := make([]api_core.ServicePort, len(ports)) - for _, port := range ports { + for i, port := range ports { if port.Port == nil { port.Port = &port.TargetPort } - serviceports = append(serviceports, api_core.ServicePort{ + serviceports[i] = api_core.ServicePort{ Name: port.Name, Protocol: api_core.Protocol(port.Protocol), Port: int32(*port.Port), TargetPort: intstr.FromInt(port.TargetPort), - }) + } } return serviceports }