package kubernetes import ( "errors" "fmt" "sync" "sync/atomic" "time" "github.com/coredns/coredns/plugin/kubernetes/object" api "k8s.io/api/core/v1" meta "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/cache" ) const ( podIPIndex = "PodIP" svcNameNamespaceIndex = "NameNamespace" svcIPIndex = "ServiceIP" epNameNamespaceIndex = "EndpointNameNamespace" epIPIndex = "EndpointsIP" ) type dnsController interface { ServiceList() []*object.Service EndpointsList() []*object.Endpoints SvcIndex(string) []*object.Service SvcIndexReverse(string) []*object.Service PodIndex(string) []*object.Pod EpIndex(string) []*object.Endpoints EpIndexReverse(string) []*object.Endpoints GetNodeByName(string) (*api.Node, error) GetNamespaceByName(string) (*api.Namespace, error) Run() HasSynced() bool Stop() error // Modified returns the timestamp of the most recent changes Modified() int64 } type dnsControl struct { // Modified tracks timestamp of the most recent changes // It needs to be first because it is guaranteed to be 8-byte // aligned ( we use sync.LoadAtomic with this ) modified int64 client kubernetes.Interface selector labels.Selector svcController cache.Controller podController cache.Controller epController cache.Controller nsController cache.Controller svcLister cache.Indexer podLister cache.Indexer epLister cache.Indexer nsLister cache.Store // stopLock is used to enforce only a single call to Stop is active. // Needed because we allow stopping through an http endpoint and // allowing concurrent stoppers leads to stack traces. stopLock sync.Mutex shutdown bool stopCh chan struct{} zones []string endpointNameMode bool } type dnsControlOpts struct { initPodCache bool initEndpointsCache bool resyncPeriod time.Duration ignoreEmptyService bool // Label handling. labelSelector *meta.LabelSelector selector labels.Selector zones []string endpointNameMode bool } // newDNSController creates a controller for CoreDNS. func newdnsController(kubeClient kubernetes.Interface, opts dnsControlOpts) *dnsControl { dns := dnsControl{ client: kubeClient, selector: opts.selector, stopCh: make(chan struct{}), zones: opts.zones, endpointNameMode: opts.endpointNameMode, } dns.svcLister, dns.svcController = object.NewIndexerInformer( &cache.ListWatch{ ListFunc: serviceListFunc(dns.client, api.NamespaceAll, dns.selector), WatchFunc: serviceWatchFunc(dns.client, api.NamespaceAll, dns.selector), }, &api.Service{}, opts.resyncPeriod, cache.ResourceEventHandlerFuncs{}, cache.Indexers{svcNameNamespaceIndex: svcNameNamespaceIndexFunc, svcIPIndex: svcIPIndexFunc}, object.ToService, ) if opts.initPodCache { dns.podLister, dns.podController = object.NewIndexerInformer( &cache.ListWatch{ ListFunc: podListFunc(dns.client, api.NamespaceAll, dns.selector), WatchFunc: podWatchFunc(dns.client, api.NamespaceAll, dns.selector), }, &api.Pod{}, opts.resyncPeriod, cache.ResourceEventHandlerFuncs{}, cache.Indexers{podIPIndex: podIPIndexFunc}, object.ToPod, ) } if opts.initEndpointsCache { dns.epLister, dns.epController = object.NewIndexerInformer( &cache.ListWatch{ ListFunc: endpointsListFunc(dns.client, api.NamespaceAll, dns.selector), WatchFunc: endpointsWatchFunc(dns.client, api.NamespaceAll, dns.selector), }, &api.Endpoints{}, opts.resyncPeriod, cache.ResourceEventHandlerFuncs{}, cache.Indexers{epNameNamespaceIndex: epNameNamespaceIndexFunc, epIPIndex: epIPIndexFunc}, object.ToEndpoints) } dns.nsLister, dns.nsController = cache.NewInformer( &cache.ListWatch{ ListFunc: namespaceListFunc(dns.client, dns.selector), WatchFunc: namespaceWatchFunc(dns.client, dns.selector), }, &api.Namespace{}, opts.resyncPeriod, cache.ResourceEventHandlerFuncs{}) return &dns } func podIPIndexFunc(obj interface{}) ([]string, error) { p, ok := obj.(*object.Pod) if !ok { return nil, errObj } return []string{p.PodIP}, nil } func svcIPIndexFunc(obj interface{}) ([]string, error) { svc, ok := obj.(*object.Service) if !ok { return nil, errObj } if len(svc.ExternalIPs) == 0 { return []string{svc.ClusterIP}, nil } return append([]string{svc.ClusterIP}, svc.ExternalIPs...), nil } func svcNameNamespaceIndexFunc(obj interface{}) ([]string, error) { s, ok := obj.(*object.Service) if !ok { return nil, errObj } return []string{s.Index}, nil } func epNameNamespaceIndexFunc(obj interface{}) ([]string, error) { s, ok := obj.(*object.Endpoints) if !ok { return nil, errObj } return []string{s.Index}, nil } func epIPIndexFunc(obj interface{}) ([]string, error) { ep, ok := obj.(*object.Endpoints) if !ok { return nil, errObj } return ep.IndexIP, nil } func serviceListFunc(c kubernetes.Interface, ns string, s labels.Selector) func(meta.ListOptions) (runtime.Object, error) { return func(opts meta.ListOptions) (runtime.Object, error) { if s != nil { opts.LabelSelector = s.String() } listV1, err := c.CoreV1().Services(ns).List(opts) return listV1, err } } func podListFunc(c kubernetes.Interface, ns string, s labels.Selector) func(meta.ListOptions) (runtime.Object, error) { return func(opts meta.ListOptions) (runtime.Object, error) { if s != nil { opts.LabelSelector = s.String() } listV1, err := c.CoreV1().Pods(ns).List(opts) return listV1, err } } func endpointsListFunc(c kubernetes.Interface, ns string, s labels.Selector) func(meta.ListOptions) (runtime.Object, error) { return func(opts meta.ListOptions) (runtime.Object, error) { if s != nil { opts.LabelSelector = s.String() } listV1, err := c.CoreV1().Endpoints(ns).List(opts) return listV1, err } } func namespaceListFunc(c kubernetes.Interface, s labels.Selector) func(meta.ListOptions) (runtime.Object, error) { return func(opts meta.ListOptions) (runtime.Object, error) { if s != nil { opts.LabelSelector = s.String() } listV1, err := c.CoreV1().Namespaces().List(opts) return listV1, err } } // Stop stops the controller. func (dns *dnsControl) Stop() error { dns.stopLock.Lock() defer dns.stopLock.Unlock() // Only try draining the workqueue if we haven't already. if !dns.shutdown { close(dns.stopCh) dns.shutdown = true return nil } return fmt.Errorf("shutdown already in progress") } // Run starts the controller. func (dns *dnsControl) Run() { go dns.svcController.Run(dns.stopCh) if dns.epController != nil { go dns.epController.Run(dns.stopCh) } if dns.podController != nil { go dns.podController.Run(dns.stopCh) } go dns.nsController.Run(dns.stopCh) <-dns.stopCh } // HasSynced calls on all controllers. func (dns *dnsControl) HasSynced() bool { a := dns.svcController.HasSynced() b := true if dns.epController != nil { b = dns.epController.HasSynced() } c := true if dns.podController != nil { c = dns.podController.HasSynced() } d := dns.nsController.HasSynced() return a && b && c && d } func (dns *dnsControl) ServiceList() (svcs []*object.Service) { os := dns.svcLister.List() for _, o := range os { s, ok := o.(*object.Service) if !ok { continue } svcs = append(svcs, s) } return svcs } func (dns *dnsControl) EndpointsList() (eps []*object.Endpoints) { os := dns.epLister.List() for _, o := range os { ep, ok := o.(*object.Endpoints) if !ok { continue } eps = append(eps, ep) } return eps } func (dns *dnsControl) PodIndex(ip string) (pods []*object.Pod) { os, err := dns.podLister.ByIndex(podIPIndex, ip) if err != nil { return nil } for _, o := range os { p, ok := o.(*object.Pod) if !ok { continue } pods = append(pods, p) } return pods } func (dns *dnsControl) SvcIndex(idx string) (svcs []*object.Service) { os, err := dns.svcLister.ByIndex(svcNameNamespaceIndex, idx) if err != nil { return nil } for _, o := range os { s, ok := o.(*object.Service) if !ok { continue } svcs = append(svcs, s) } return svcs } func (dns *dnsControl) SvcIndexReverse(ip string) (svcs []*object.Service) { os, err := dns.svcLister.ByIndex(svcIPIndex, ip) if err != nil { return nil } for _, o := range os { s, ok := o.(*object.Service) if !ok { continue } svcs = append(svcs, s) } return svcs } func (dns *dnsControl) EpIndex(idx string) (ep []*object.Endpoints) { os, err := dns.epLister.ByIndex(epNameNamespaceIndex, idx) if err != nil { return nil } for _, o := range os { e, ok := o.(*object.Endpoints) if !ok { continue } ep = append(ep, e) } return ep } func (dns *dnsControl) EpIndexReverse(ip string) (ep []*object.Endpoints) { os, err := dns.epLister.ByIndex(epIPIndex, ip) if err != nil { return nil } for _, o := range os { e, ok := o.(*object.Endpoints) if !ok { continue } ep = append(ep, e) } return ep } // GetNodeByName return the node by name. If nothing is found an error is // returned. This query causes a roundtrip to the k8s API server, so use // sparingly. Currently this is only used for Federation. func (dns *dnsControl) GetNodeByName(name string) (*api.Node, error) { v1node, err := dns.client.CoreV1().Nodes().Get(name, meta.GetOptions{}) return v1node, err } // GetNamespaceByName returns the namespace by name. If nothing is found an error is returned. func (dns *dnsControl) GetNamespaceByName(name string) (*api.Namespace, error) { os := dns.nsLister.List() for _, o := range os { ns, ok := o.(*api.Namespace) if !ok { continue } if name == ns.ObjectMeta.Name { return ns, nil } } return nil, fmt.Errorf("namespace not found") } func (dns *dnsControl) Modified() int64 { unix := atomic.LoadInt64(&dns.modified) return unix } // updateModified set dns.modified to the current time. func (dns *dnsControl) updateModifed() { unix := time.Now().Unix() atomic.StoreInt64(&dns.modified, unix) } var errObj = errors.New("obj was not of the correct type") torage-studio Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/examples/with-mdx (unfollow)
AgeCommit message (Collapse)AuthorFilesLines
2025-03-31[ci] release (#13513)astro@5.5.6@astrojs/vue@5.0.9@astrojs/svelte@7.0.9@astrojs/studio@0.1.6@astrojs/solid-js@5.0.7@astrojs/react@4.2.3@astrojs/preact@4.0.8@astrojs/netlify@6.2.5@astrojs/mdx@4.2.3@astrojs/markdoc@0.13.3@astrojs/db@0.14.10@astrojs/cloudflare@12.4.0@astrojs/alpinejs@0.4.5Gravatar Houston (Bot) 1-3/+3
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-31fix: update `vite` to latest version (#13526)Gravatar Junseong Park 15-101/+118
* fix: update `vite` to latest version * apply suggestion Co-authored-by: ematipico <602478+ematipico@users.noreply.github.com>
2025-03-31[ci] formatGravatar Emanuele Stoppa 3-4/+2
2025-03-31fix(i18n): return value from `preferredLocale` (#13524)Gravatar Emanuele Stoppa 5-15/+51
* fix(i18n): return value from `preferredLocale` * revert change Co-authored-by: florian-lefebvre <69633530+florian-lefebvre@users.noreply.github.com>
2025-03-31chore(tailwind): delete integration (#13511)Gravatar Florian Lefebvre 16-1083/+1
2025-03-31fix(deps): update all non-major dependencies (#13521)Gravatar renovate[bot] 14-163/+163
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-31[ci] formatGravatar Matt Kane 3-4/+3
2025-03-31feat(cloudflare): add KV session storage support (#13514)Gravatar Matt Kane 19-487/+490
* feat(cloudflare): add KV session storage support * Change code block language to JSONC * Comments * Use user-defined binding name * Use createCodegenDir * Remove unused import
2025-03-31fix(deps): update astro client runtimes (#13522)Gravatar renovate[bot] 4-6/+7
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-27fix(deps): update astro dependencies (#13498)Gravatar renovate[bot] 47-412/+427
* fix(deps): update astro dependencies * fix types shenanigans --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Emanuele Stoppa <my.burning@gmail.com>
2025-03-27[ci] formatGravatar Emanuele Stoppa 3-8/+7
2025-03-27refactor(actions): use `Omit` to avoid leaking types to shared context (#13429)Gravatar Emanuele Stoppa 5-11/+41
* wip * fix(actions): avoid mutation of action context * chore: revert changes * add changeset * Update .changeset/calm-beans-roll.md Co-authored-by: Florian Lefebvre <contact@florian-lefebvre.dev> --------- Co-authored-by: Florian Lefebvre <contact@florian-lefebvre.dev>
2025-03-26[ci] release (#13504)astro@5.5.5@astrojs/vue@5.0.8@astrojs/tailwind@6.0.2@astrojs/svelte@7.0.8@astrojs/studio@0.1.5@astrojs/solid-js@5.0.6@astrojs/react@4.2.2@astrojs/preact@4.0.7@astrojs/netlify@6.2.4@astrojs/mdx@4.2.2@astrojs/markdoc@0.13.2@astrojs/db@0.14.9@astrojs/cloudflare@12.3.1@astrojs/alpinejs@0.4.4Gravatar Houston (Bot) 56-132/+197
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-26[ci] formatGravatar Florian Lefebvre 2-2/+2
2025-03-26fix(astro): dynamically import actions (#13510)Gravatar Florian Lefebvre 12-51/+96
* feat: update test * feat: dynamic import * chore: changeset * Update .changeset/clever-tigers-dig.md
2025-03-26[ci] formatGravatar Matt Kane 2-2/+2
2025-03-26fix: cache raw cookie value and decode when getting (#13485)Gravatar Matt Kane 3-17/+37
* fix: cache raw cookie value and decode when getting * Add test * Add comment
2025-03-25fix: update vite (#13505)Gravatar Emanuele Stoppa 16-104/+123
* fix: update vite * use dedupe
2025-03-24[ci] formatGravatar Emanuele Stoppa 1-1/+1
2025-03-24fix(app): call renderer when routes don't match (#13483)Gravatar Emanuele Stoppa 4-1/+30
* fix(app): call renderer when routes don't match * chore: pick 404 exactly * chore: pick route differently Co-authored-by: ascorbic <213306+ascorbic@users.noreply.github.com>
2025-03-21[ci] release (#13460)astro@5.5.4@astrojs/vercel@8.1.3@astrojs/tailwind@6.0.1@astrojs/svelte@7.0.7@astrojs/preact@4.0.6@astrojs/cloudflare@12.3.0Gravatar Houston (Bot) 45-118/+119
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-03-21fix: better error handling on Stackblitz (#13484)Gravatar Matt Kane 2-0/+12
* fix: better error handling on Stackblitz * Remove unused imports
2025-03-21Repair server islands to work with client router (#13481)Gravatar Martin Trapp 2-6/+11
* rerun server island scripts when used with client router
2025-03-21fix: generate correct external redirects (#13480)Gravatar Matt Kane 3-4/+21
2025-03-21fix(deps): update all non-major dependencies (#13440)Gravatar renovate[bot] 24-435/+436
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-21[ci] formatGravatar Florian Lefebvre 2-2/+2
2025-03-21feat(cloudflare): global env (#13444)Gravatar Florian Lefebvre 6-47/+130
* feat(cloudflare): global env * fix: test
2025-03-21fix(deps): update astro client runtimes (#13474)Gravatar renovate[bot] 7-345/+348
* fix(deps): update astro client runtimes * fix: pin vite-plugin-vue --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Florian Lefebvre <contact@florian-lefebvre.dev>
2025-03-20Small change to linking style (#13472)Gravatar Chris Swithinbank 1-1/+1
Co-authored-by: sarah11918 <5098874+sarah11918@users.noreply.github.com>
2025-03-20Add deprecation notice to Tailwind integration README (#13471)Gravatar Chris Swithinbank 2-6/+11
* Add deprecation notice to Tailwind integration README * Add changeset * Use `[docs]` link style again * update link to more direct content --------- Co-authored-by: Sarah Rainsberger <5098874+sarah11918@users.noreply.github.com> Co-authored-by: anaxite <89195061+anaxite@users.noreply.github.com> Co-authored-by: sarah11918 <5098874+sarah11918@users.noreply.github.com> Co-authored-by: Adammatthiesen <30383579+Adammatthiesen@users.noreply.github.com> Co-authored-by: HiDeoo <494699+HiDeoo@users.noreply.github.com>
2025-03-20[ci] formatGravatar Matt Kane 2-2/+1
2025-03-20fix(preact,svelte): empty target container before rendering `client:only` ↵Gravatar Matt Kane 5-5/+41
island (#13470) * fix(preact,svelte): empty target container before rendering `client:only` island * Remove log
2025-03-20chore(renovate): group updates (#13466)Gravatar Emanuele Stoppa 1-11/+58
2025-03-19[ci] formatGravatar Matt Kane 1-3/+2
2025-03-19fix: don't attempt to move files after build with base (#13463)Gravatar Matt Kane 8-13/+66
* fix: don't attempt to move files after build with base * Remove console * Reword changeset * Remove unused import
2025-03-19[ci] formatGravatar Emanuele Stoppa 2-6/+18
2025-03-19fix(routing): don't add site to static redirects (#13447)Gravatar Emanuele Stoppa 7-10/+49
* fix(routing): don't add site to static redirects * chore: fix canonical tag * chore: fix canonical tag Co-authored-by: ascorbic <213306+ascorbic@users.noreply.github.com>
2025-03-18[ci] formatGravatar Matt Kane 2-2/+1
2025-03-18fix: set correct statusText for custom error pages (#13457)Gravatar Matt Kane 4-2/+19
* fix: set correct statusText for custom error pages * Set conditionally
2025-03-18chore(deps): update github-actions (#13459)Gravatar renovate[bot] 9-13/+13
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-18chore(deps): update github-actions (#13458)Gravatar renovate[bot] 1-5/+5
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-18[ci] formatGravatar Emanuele Stoppa 1-1/+3
2025-03-18chore: remove deprecated package (#13455)Gravatar Emanuele Stoppa 3-23/+16
2025-03-18fix(deps): update dependency miniflare to v4 (#13441)Gravatar renovate[bot] 2-31/+31
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>