Beispiel #1
0
        private async Task OnWatcherStateChanged <TResource, TResourceList>(
            ManagedWatcher <TResource, TResourceList, WatcherEvent <TResource> > sender,
            ManagedWatcherStateUpdate update) where TResource : class, IKubernetesObject
        {
            var tag = sender.Tag ?? string.Empty;

            switch (update.State)
            {
            case ManagedWatcherState.Closed:
                _logger.LogDebug("{type} watcher {tag} {state}", typeof(TResource).Name, tag, update.State);
                await _secretsWatcher.Stop();

                foreach (var certificatesWatcher in _certificatesWatchers.Values)
                {
                    await certificatesWatcher.Stop();
                }

                await _eventQueue.WaitAndClear();

                await _secretsWatcher.Start();

                foreach (var certificatesWatcher in _certificatesWatchers.Values)
                {
                    await certificatesWatcher.Start();
                }
                break;

            case ManagedWatcherState.Faulted:
                _logger.LogError(update.Exception, "{type} watcher {tag} {state}", typeof(TResource).Name, tag,
                                 update.State);
                break;

            default:
                _logger.LogDebug("{type} watcher {tag} {state}", typeof(TResource).Name, tag, update.State);
                break;
            }
        }
Beispiel #2
0
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            try
            {
                await _apiClient.ListCustomResourceDefinitionAsync(cancellationToken : cancellationToken);

                await _crdV1Watcher.Start();
            }
            catch (HttpOperationException exception) when(exception.Response.StatusCode == HttpStatusCode.NotFound)
            {
                _logger.LogWarning(
                    "Current kubernetes version does not support {type} apiVersion {version}.",
                    V1CustomResourceDefinition.KubeKind, V1CustomResourceDefinition.KubeApiVersion);
                Onv1Beta1CrdRefresh();
                _v1Beta1CrdMonitorTimer.Start();
            }
        }
Beispiel #3
0
        private async Task OnCrdWatcherStateChanged <TResource, TResourceList>(
            ManagedWatcher <TResource, TResourceList, WatcherEvent <TResource> > sender, ManagedWatcherStateUpdate update)
            where TResource : class, IKubernetesObject
        {
            switch (update.State)
            {
            case ManagedWatcherState.Closed:
                _logger.LogDebug("{type} watcher {state}", typeof(TResource).Name, update.State);
                await sender.Start();

                break;

            case ManagedWatcherState.Faulted:
                _logger.LogError(update.Exception, "{type} watcher {state}",
                                 typeof(TResource).Name, update.State);
                break;

            default:
                _logger.LogDebug("{type} watcher {state}", typeof(TResource).Name, update.State);
                break;
            }
        }
Beispiel #4
0
 public async Task StartAsync(CancellationToken cancellationToken)
 {
     await _secretsWatcher.Start();
 }
        protected async Task WatchersStart()
        {
            await _resourceWatcher.Start();

            await _namespaceWatcher.Start();
        }
        private async Task OnCertManagerDiscovery()
        {
            _logger.LogTrace("Searching for cert-manager CRDs");
            //Get all CRDs in order to check for cert-manager specific CRDs
            var customResourceDefinitions = await _apiClient.ListCustomResourceDefinitionAsync();

            //Find the `Certificate` CRD (if installed)
            var certCrd = customResourceDefinitions.Items.FirstOrDefault(s =>
                                                                         s.Spec?.Names != null && s.Spec.Group == CertManagerConstants.CrdGroup &&
                                                                         s.Spec.Names.Kind == CertManagerConstants.CertificateKind);
            var versions = new List <string>();

            //Get Certificate CRD versions
            if (!(certCrd is null))
            {
                versions = certCrd.Spec.Versions.Select(s => s.Name).ToList();
            }

            _logger.LogTrace("Cert-manager CRDs versions found: `{versions}`", versions);

            //Check if at least one Certificate exists (regardless of version) so we can start monitoring
            var version          = versions.OrderBy(s => s, KubernetesVersionComparer.Instance).LastOrDefault();
            var certificatesExit = false;

            if (version != null)
            {
                var certList = ((JObject)await _apiClient.ListClusterCustomObjectAsync(CertManagerConstants.CrdGroup,
                                                                                       version,
                                                                                       CertManagerConstants.CertificatePlural)).ToObject <KubernetesList <Certificate> >();
                certificatesExit = certList.Items.Any();
            }


            //If no certificate exists, stop everything. Timer will periodically check again
            if (!certificatesExit)
            {
                await _certificateWatcher.Stop();

                await _secretsWatcher.Stop();

                _version = null;
                _logger.LogTrace("No {kind} found.", CertManagerConstants.CertificateKind);
                return;
            }

            if (_version != version)
            {
                _logger.LogDebug("{kind} version is {version}", CertManagerConstants.CertificateKind, version);

                await _certificateWatcher.Stop();

                await _secretsWatcher.Stop();

                _version = version;
                if (_version != null)
                {
                    await _certificateWatcher.Start();

                    await _secretsWatcher.Start();
                }
            }
        }