[master] Auto-update dependencies (#264)

Produced via:
  `./hack/update-deps.sh --upgrade && ./hack/update-codegen.sh`
/assign n3wscott vagababov
/cc n3wscott vagababov
This commit is contained in:
Matt Moore 2020-05-04 09:54:44 -07:00 committed by GitHub
parent c55f2d33c5
commit f7d206ca4a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 141 additions and 83 deletions

4
go.mod
View File

@ -18,8 +18,8 @@ require (
k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible
k8s.io/code-generator v0.18.0
k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf
knative.dev/pkg v0.0.0-20200501005942-d980c0865972
knative.dev/test-infra v0.0.0-20200430225942-f7c1fafc1cde
knative.dev/pkg v0.0.0-20200504072243-f591fc672afa
knative.dev/test-infra v0.0.0-20200501211843-902135793f08
)
replace (

8
go.sum
View File

@ -914,12 +914,12 @@ k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl
k8s.io/utils v0.0.0-20190907131718-3d4f5b7dea0b h1:eMM0sTvh3KBVGwJfuNcU86P38TJhlVMAICbFPDG3t0M=
k8s.io/utils v0.0.0-20190907131718-3d4f5b7dea0b/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
knative.dev/pkg v0.0.0-20191101194912-56c2594e4f11/go.mod h1:pgODObA1dTyhNoFxPZTTjNWfx6F0aKsKzn+vaT9XO/Q=
knative.dev/pkg v0.0.0-20200501005942-d980c0865972 h1:N/umsmNgROaU+fIziEBZ+L32OMpgwZRYW3VeHUPR8ZA=
knative.dev/pkg v0.0.0-20200501005942-d980c0865972/go.mod h1:X4wmXb4xUR+1eDBoP6AeVfAqsyxl1yATnRdSgFdjhQw=
knative.dev/test-infra v0.0.0-20200429211942-f4c4853375cf h1:rNWg3NiXNLjZC9C1EJf2qKA+mRnrWMLW1KONsEusLYg=
knative.dev/test-infra v0.0.0-20200429211942-f4c4853375cf/go.mod h1:xcdUkMJrLlBswIZqL5zCuBFOC22WIPMQoVX1L35i0vQ=
knative.dev/pkg v0.0.0-20200504072243-f591fc672afa h1:828TZbIIKb5O98q484YTSn5cjiZjxkue1ksJ3O6G+iI=
knative.dev/pkg v0.0.0-20200504072243-f591fc672afa/go.mod h1:1RvwKBbKqKYt5rgI4lfYdWCdtXgMxJY73QxPb3jZPC4=
knative.dev/test-infra v0.0.0-20200430225942-f7c1fafc1cde h1:QSzxFsf21WXNhODvh0jRKbFR+c5UI7WFjiISy/sMOLg=
knative.dev/test-infra v0.0.0-20200430225942-f7c1fafc1cde/go.mod h1:xcdUkMJrLlBswIZqL5zCuBFOC22WIPMQoVX1L35i0vQ=
knative.dev/test-infra v0.0.0-20200501211843-902135793f08 h1:MWN+yyFFtNa9wSLx8VWFlLmJP6q3p0t+nhGj9hpJwH8=
knative.dev/test-infra v0.0.0-20200501211843-902135793f08/go.mod h1:xcdUkMJrLlBswIZqL5zCuBFOC22WIPMQoVX1L35i0vQ=
modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=

View File

@ -185,29 +185,9 @@ func NewImpl(ctx {{.contextContext|raw}}, r Interface{{if .hasClass}}, classValu
{{.type|lowercaseSingular}}Informer := {{.informerGet|raw}}(ctx)
recorder := {{.controllerGetEventRecorder|raw}}(ctx)
if recorder == nil {
// Create event broadcaster
logger.Debug("Creating event broadcaster")
eventBroadcaster := {{.recordNewBroadcaster|raw}}()
watches := []{{.watchInterface|raw}}{
eventBroadcaster.StartLogging(logger.Named("event-broadcaster").Infof),
eventBroadcaster.StartRecordingToSink(
&{{.typedcorev1EventSinkImpl|raw}}{Interface: {{.kubeclientGet|raw}}(ctx).CoreV1().Events("")}),
}
recorder = eventBroadcaster.NewRecorder({{.schemeScheme|raw}}, {{.corev1EventSource|raw}}{Component: defaultControllerAgentName})
go func() {
<-ctx.Done()
for _, w := range watches {
w.Stop()
}
}()
}
rec := &reconcilerImpl{
Client: {{.clientGet|raw}}(ctx),
Lister: {{.type|lowercaseSingular}}Informer.Lister(),
Recorder: recorder,
reconciler: r,
finalizerName: defaultFinalizerName,
{{if .hasClass}}classValue: classValue,{{end}}
@ -217,6 +197,7 @@ func NewImpl(ctx {{.contextContext|raw}}, r Interface{{if .hasClass}}, classValu
queueName := {{.fmtSprintf|raw}}("%s.%s", {{.stringsReplaceAll|raw}}(t.PkgPath(), "/", "-"), t.Name())
impl := {{.controllerNewImpl|raw}}(rec, logger, queueName)
agentName := defaultControllerAgentName
// Pass impl to the options. Save any optional results.
for _, fn := range optionsFns {
@ -227,11 +208,41 @@ func NewImpl(ctx {{.contextContext|raw}}, r Interface{{if .hasClass}}, classValu
if opts.FinalizerName != "" {
rec.finalizerName = opts.FinalizerName
}
if opts.AgentName != "" {
agentName = opts.AgentName
}
}
rec.Recorder = createRecorder(ctx, agentName)
return impl
}
func createRecorder(ctx context.Context, agentName string) record.EventRecorder {
logger := {{.loggingFromContext|raw}}(ctx)
recorder := {{.controllerGetEventRecorder|raw}}(ctx)
if recorder == nil {
// Create event broadcaster
logger.Debug("Creating event broadcaster")
eventBroadcaster := {{.recordNewBroadcaster|raw}}()
watches := []{{.watchInterface|raw}}{
eventBroadcaster.StartLogging(logger.Named("event-broadcaster").Infof),
eventBroadcaster.StartRecordingToSink(
&{{.typedcorev1EventSinkImpl|raw}}{Interface: {{.kubeclientGet|raw}}(ctx).CoreV1().Events("")}),
}
recorder = eventBroadcaster.NewRecorder({{.schemeScheme|raw}}, {{.corev1EventSource|raw}}{Component: agentName})
go func() {
<-ctx.Done()
for _, w := range watches {
w.Stop()
}
}()
}
return recorder
}
func init() {
{{.schemeAddToScheme|raw}}({{.schemeScheme|raw}})
}

View File

@ -96,7 +96,7 @@ func Filter(gvk schema.GroupVersionKind) func(obj interface{}) bool {
// cache.FilteringResourceEventHandler that filter based on the
// schema.GroupVersionKind of the controlling resources.
//
// Deprecated: Use FilterControlledByGVK instead.
// Deprecated: Use FilterControllerGVK instead.
func FilterGroupVersionKind(gvk schema.GroupVersionKind) func(obj interface{}) bool {
return FilterControllerGVK(gvk)
}
@ -122,7 +122,7 @@ func FilterControllerGVK(gvk schema.GroupVersionKind) func(obj interface{}) bool
// cache.FilteringResourceEventHandler that filter based on the
// schema.GroupKind of the controlling resources.
//
// Deprecated: Use FilterControlledByGK instead
// Deprecated: Use FilterControllerGK instead
func FilterGroupKind(gk schema.GroupKind) func(obj interface{}) bool {
return FilterControllerGK(gk)
}

View File

@ -27,6 +27,10 @@ type Options struct {
// FinalizerName is the name of the finalizer this reconciler uses. This
// overrides a default finalizer name assigned by the generator if needed.
FinalizerName string
// AgentName is the name of the agent this reconciler uses. This overrides
// the default controller's agent name.
AgentName string
}
// OptionsFn is a callback method signature that accepts an Impl and returns

View File

@ -29,6 +29,7 @@ import (
"go.opencensus.io/stats"
"go.uber.org/zap"
corev1 "k8s.io/api/core/v1"
"knative.dev/pkg/metrics/metricskey"
)
@ -88,9 +89,8 @@ type metricsConfig struct {
// writing the metrics to the stats.RecordWithOptions interface.
recorder func(context.Context, []stats.Measurement, ...stats.Options) error
// secretFetcher provides access for fetching Kubernetes Secrets from an
// informer cache.
secretFetcher SecretFetcher
// secret contains credentials for an exporter to use for authentication.
secret *corev1.Secret
// ---- OpenCensus specific below ----
// collectorAddress is the address of the collector, if not `localhost:55678`
@ -162,10 +162,6 @@ func (mc *metricsConfig) record(ctx context.Context, mss []stats.Measurement, ro
func createMetricsConfig(ops ExporterOptions, logger *zap.SugaredLogger) (*metricsConfig, error) {
var mc metricsConfig
// We don't check if this is `nil` right now, because this is a transition step.
// Eventually, this should be a startup check.
mc.secretFetcher = ops.Secrets
if ops.Domain == "" {
return nil, errors.New("metrics domain cannot be empty")
}
@ -205,6 +201,13 @@ func createMetricsConfig(ops ExporterOptions, logger *zap.SugaredLogger) (*metri
if mc.requireSecure, err = strconv.ParseBool(isSecure); err != nil {
return nil, fmt.Errorf("invalid %s value %q", CollectorSecureKey, isSecure)
}
if mc.requireSecure {
mc.secret, err = getOpenCensusSecret(ops.Component, ops.Secrets)
if err != nil {
return nil, err
}
}
}
}
@ -265,6 +268,15 @@ func createMetricsConfig(ops ExporterOptions, logger *zap.SugaredLogger) (*metri
return stats.RecordWithOptions(ctx, append(ros, stats.WithMeasurements(mss...))...)
}
}
if scc.UseSecret {
secret, err := getStackdriverSecret(ops.Secrets)
if err != nil {
return nil, err
}
mc.secret = secret
}
}
// If reporting period is specified, use the value from the configuration.

View File

@ -121,6 +121,7 @@ func UpdateExporterFromConfigMapWithOpts(opts ExporterOptions, logger *zap.Sugar
Component: opts.Component,
ConfigMap: configMap.Data,
PrometheusPort: opts.PrometheusPort,
Secrets: opts.Secrets,
}, logger)
}, nil
}
@ -130,6 +131,7 @@ func UpdateExporterFromConfigMapWithOpts(opts ExporterOptions, logger *zap.Sugar
// to prevent a race condition between reading the current configuration
// and updating the current exporter.
func UpdateExporter(ops ExporterOptions, logger *zap.SugaredLogger) error {
// TODO(https://github.com/knative/pkg/issues/1273): check if ops.secrets is `nil` after new metrics plan lands
newConfig, err := createMetricsConfig(ops, logger)
if err != nil {
if getCurMetricsConfig() == nil {
@ -141,28 +143,33 @@ func UpdateExporter(ops ExporterOptions, logger *zap.SugaredLogger) error {
return err
}
// Updating the metrics config and the metrics exporters needs to be atomic to
// avoid using an outdated metrics config with new exporters.
metricsMux.Lock()
defer metricsMux.Unlock()
if isNewExporterRequired(newConfig) {
logger.Info("Flushing the existing exporter before setting up the new exporter.")
FlushExporter()
flushGivenExporter(curMetricsExporter)
e, err := newMetricsExporter(newConfig, logger)
if err != nil {
logger.Errorf("Failed to update a new metrics exporter based on metric config %v. error: %v", newConfig, err)
return err
}
existingConfig := getCurMetricsConfig()
setCurMetricsExporter(e)
existingConfig := curMetricsConfig
curMetricsExporter = e
logger.Infof("Successfully updated the metrics exporter; old config: %v; new config %v", existingConfig, newConfig)
}
setCurMetricsConfig(newConfig)
setCurMetricsConfigUnlocked(newConfig)
return nil
}
// isNewExporterRequired compares the non-nil newConfig against curMetricsConfig. When backend changes,
// or stackdriver project ID changes for stackdriver backend, we need to update the metrics exporter.
// This function is not implicitly thread-safe.
// This function must be called with the metricsMux reader (or writer) locked.
func isNewExporterRequired(newConfig *metricsConfig) bool {
cc := getCurMetricsConfig()
cc := curMetricsConfig
if cc == nil || newConfig.backendDestination != cc.backendDestination {
return true
}
@ -177,15 +184,14 @@ func isNewExporterRequired(newConfig *metricsConfig) bool {
}
// newMetricsExporter gets a metrics exporter based on the config.
// This function is not implicitly thread-safe.
// This function must be called with the metricsMux reader (or writer) locked.
func newMetricsExporter(config *metricsConfig, logger *zap.SugaredLogger) (view.Exporter, error) {
ce := getCurMetricsExporter()
// If there is a Prometheus Exporter server running, stop it.
resetCurPromSrv()
// TODO(https://github.com/knative/pkg/issues/866): Move Stackdriver and Promethus
// operations before stopping to an interface.
if se, ok := ce.(stoppable); ok {
if se, ok := curMetricsExporter.(stoppable); ok {
se.StopMetricsExporter()
}
@ -230,6 +236,10 @@ func getCurMetricsConfig() *metricsConfig {
func setCurMetricsConfig(c *metricsConfig) {
metricsMux.Lock()
defer metricsMux.Unlock()
setCurMetricsConfigUnlocked(c)
}
func setCurMetricsConfigUnlocked(c *metricsConfig) {
if c != nil {
view.SetReportingPeriod(c.reportingPeriod)
} else {
@ -244,6 +254,10 @@ func setCurMetricsConfig(c *metricsConfig) {
// Return value indicates whether the exporter is flushable or not.
func FlushExporter() bool {
e := getCurMetricsExporter()
return flushGivenExporter(e)
}
func flushGivenExporter(e view.Exporter) bool {
if e == nil {
return false
}

View File

@ -24,6 +24,7 @@ import (
"go.opencensus.io/stats/view"
"go.uber.org/zap"
"google.golang.org/grpc/credentials"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
)
@ -33,49 +34,53 @@ func newOpenCensusExporter(config *metricsConfig, logger *zap.SugaredLogger) (vi
opts = append(opts, ocagent.WithAddress(config.collectorAddress))
}
if config.requireSecure {
opts = append(opts, ocagent.WithTLSCredentials(credentialFetcher(config.component, config.secretFetcher, logger)))
opts = append(opts, ocagent.WithTLSCredentials(getCredentials(config.component, config.secret, logger)))
} else {
opts = append(opts, ocagent.WithInsecure())
}
e, err := ocagent.NewExporter(opts...)
if err != nil {
logger.Errorw("Failed to create the OpenCensus exporter.", zap.Error(err))
logger.Errorw("failed to create the OpenCensus exporter.", zap.Error(err))
return nil, err
}
logger.Infof("Created OpenCensus exporter with config: %+v.", *config)
logger.Infof("created OpenCensus exporter with config: %+v.", *config)
view.RegisterExporter(e)
return e, nil
}
// credentialFetcher attempts to locate a secret containing TLS credentials
// getOpenCensusSecret attempts to locate a secret containing TLS credentials
// for communicating with the OpenCensus Agent. To do this, it first looks
// for a secret named "<component>-opencensus", then for a generic
// "opencensus" secret.
func credentialFetcher(component string, lister SecretFetcher, logger *zap.SugaredLogger) credentials.TransportCredentials {
func getOpenCensusSecret(component string, lister SecretFetcher) (*corev1.Secret, error) {
if lister == nil {
logger.Errorf("No secret lister provided for component %q; cannot use requireSecure=true", component)
return nil, fmt.Errorf("no secret lister provided for component %q; cannot use requireSecure=true", component)
}
secret, err := lister(component + "-opencensus")
if errors.IsNotFound(err) {
secret, err = lister("opencensus")
}
if err != nil {
return nil, fmt.Errorf("unable to fetch opencensus secret for %q, cannot use requireSecure=true: %+v", component, err)
}
return secret, nil
}
// getCredentials attempts to create a certificate containing TLS credentials
// for communicating with the OpenCensus Agent.
func getCredentials(component string, secret *corev1.Secret, logger *zap.SugaredLogger) credentials.TransportCredentials {
if secret == nil {
logger.Errorf("no secret provided for component %q; cannot use requireSecure=true", component)
return nil
}
return credentials.NewTLS(&tls.Config{
GetClientCertificate: func(*tls.CertificateRequestInfo) (*tls.Certificate, error) {
// We ignore the CertificateRequestInfo for now, and hand back a single fixed certificate.
// TODO(evankanderson): maybe do something SPIFFE-ier?
cert, err := certificateFetcher(component+"-opencensus", lister)
if errors.IsNotFound(err) {
cert, err = certificateFetcher("opencensus", lister)
}
cert, err := tls.X509KeyPair(secret.Data["client-cert.pem"], secret.Data["client-key.pem"])
if err != nil {
return nil, fmt.Errorf("Unable to fetch opencensus secret for %q, cannot use requireSecure=true: %+v", component, err)
return nil, err
}
return &cert, err
return &cert, nil
},
})
}
func certificateFetcher(secretName string, lister SecretFetcher) (tls.Certificate, error) {
secret, err := lister(secretName)
if err != nil {
return tls.Certificate{}, err
}
return tls.X509KeyPair(secret.Data["client-cert.pem"], secret.Data["client-key.pem"])
}

View File

@ -115,7 +115,7 @@ func newOpencensusSDExporter(o stackdriver.Options) (view.Exporter, error) {
func newStackdriverExporter(config *metricsConfig, logger *zap.SugaredLogger) (view.Exporter, error) {
gm := getMergedGCPMetadata(config)
mpf := getMetricPrefixFunc(config.stackdriverMetricTypePrefix, config.stackdriverCustomMetricTypePrefix)
co, err := getStackdriverExporterClientOptions(&config.stackdriverClientConfig)
co, err := getStackdriverExporterClientOptions(config)
if err != nil {
logger.Warnw("Issue configuring Stackdriver exporter client options, no additional client options will be used: ", zap.Error(err))
}
@ -140,21 +140,21 @@ func newStackdriverExporter(config *metricsConfig, logger *zap.SugaredLogger) (v
// getStackdriverExporterClientOptions creates client options for the opencensus Stackdriver exporter from the given stackdriverClientConfig.
// On error, an empty array of client options is returned.
func getStackdriverExporterClientOptions(sdconfig *StackdriverClientConfig) ([]option.ClientOption, error) {
func getStackdriverExporterClientOptions(config *metricsConfig) ([]option.ClientOption, error) {
var co []option.ClientOption
if sdconfig.UseSecret && useStackdriverSecretEnabled {
secret, err := getStackdriverSecret(sdconfig)
if err != nil {
return co, err
// SetStackdriverSecretLocation must have been called by calling package for this to work.
if config.stackdriverClientConfig.UseSecret {
if config.secret == nil {
return co, fmt.Errorf("No secret provided for component %q; cannot use stackdriver-use-secret=true", config.component)
}
if opt, err := convertSecretToExporterOption(secret); err == nil {
if opt, err := convertSecretToExporterOption(config.secret); err == nil {
co = append(co, opt)
} else {
return co, err
}
}
return co, nil
}
@ -215,19 +215,31 @@ func getMetricPrefixFunc(metricTypePrefix, customMetricTypePrefix string) func(n
}
// getStackdriverSecret returns the Kubernetes Secret specified in the given config.
// SetStackdriverSecretLocation must have been called by calling package for this to work.
// TODO(anniefu): Update exporter if Secret changes (https://github.com/knative/pkg/issues/842)
func getStackdriverSecret(sdconfig *StackdriverClientConfig) (*corev1.Secret, error) {
if err := ensureKubeclient(); err != nil {
return nil, err
}
func getStackdriverSecret(secretFetcher SecretFetcher) (*corev1.Secret, error) {
stackdriverMtx.RLock()
defer stackdriverMtx.RUnlock()
sec, secErr := kubeclient.CoreV1().Secrets(secretNamespace).Get(secretName, metav1.GetOptions{})
if !useStackdriverSecretEnabled {
return nil, nil
}
var secErr error
var sec *corev1.Secret
if secretFetcher != nil {
sec, secErr = secretFetcher(fmt.Sprintf("%s/%s", secretNamespace, secretName))
} else {
// This else-block can be removed once UpdateExporterFromConfigMap is fully deprecated in favor of ConfigMapWatcher
if err := ensureKubeclient(); err != nil {
return nil, err
}
sec, secErr = kubeclient.CoreV1().Secrets(secretNamespace).Get(secretName, metav1.GetOptions{})
}
if secErr != nil {
return nil, fmt.Errorf("Error getting Secret [%s] in namespace [%s]: %w", secretName, secretNamespace, secErr)
return nil, fmt.Errorf("error getting Secret [%v] in namespace [%v]: %v", secretName, secretNamespace, secErr)
}
return sec, nil

4
vendor/modules.txt vendored
View File

@ -651,7 +651,7 @@ k8s.io/kube-openapi/pkg/util/sets
k8s.io/utils/buffer
k8s.io/utils/integer
k8s.io/utils/trace
# knative.dev/pkg v0.0.0-20200501005942-d980c0865972
# knative.dev/pkg v0.0.0-20200504072243-f591fc672afa
knative.dev/pkg/apis
knative.dev/pkg/changeset
knative.dev/pkg/codegen/cmd/injection-gen
@ -668,7 +668,7 @@ knative.dev/pkg/logging/logkey
knative.dev/pkg/metrics
knative.dev/pkg/metrics/metricskey
knative.dev/pkg/reconciler
# knative.dev/test-infra v0.0.0-20200430225942-f7c1fafc1cde
# knative.dev/test-infra v0.0.0-20200501211843-902135793f08
knative.dev/test-infra/scripts
knative.dev/test-infra/tools/dep-collector
# sigs.k8s.io/yaml v1.1.0