CCM only requests IPs once for a given service

If you give the IP back (set the service to ClusterIP), the IP request is deleted properly after some time.
But if you then request the LoadBalancer again, you get the same IP in K8s (state is somewhere cached?), but the CCM does not request a working IP from the IPAM (dashboard is empty). And of course the "re-used" IP does not work.

Can you give a step-by-step guide to reproducing this one? And if you are able to reproduce it, logs from CCM with --v=5 would help.

As requested:

[x] Step 1: Ensure that the ccm is properly configured in the control plane (I am using Gardener). And set --v=5.

    spec:
      containers:
      - command:
        - ./cloud-provider-equinix-metal
        - --cloud-provider=equinixmetal
        - --leader-elect=false
        - --allow-untagged-cloud=true
        - --authentication-skip-lookup=true
        - --kubeconfig=/var/lib/cloud-controller-manager/kubeconfig
        - --v=5
        env:
        - name: METAL_API_KEY
          valueFrom:
            secretKeyRef:
              key: apiToken
              name: cloudprovider
        - name: METAL_PROJECT_ID
          valueFrom:
            secretKeyRef:
              key: projectID
              name: cloudprovider
        - name: METAL_FACILITY_NAME
          value: ewr1
        - name: METAL_LOAD_BALANCER
          value: metallb:///
        image: docker.io/equinix/cloud-provider-equinix-metal:v3.2.0
        imagePullPolicy: IfNotPresent
        name: cloud-provider-equinix-metal

(I used v3.2.0, the same effect is with v3.2.2)

[x] Step 2: Install a service (like Istio) with LoadBalancer and follow the logs with kubectl logs cloud-controller-manager

Flag --allow-untagged-cloud has been deprecated, This flag is deprecated and will be removed in a future release. A cluster-id will be required on cloud instances.
I1005 13:56:38.707240       1 main.go:240] authToken: '<masked>'
I1005 13:56:38.707274       1 main.go:240] projectID: '************************************'
I1005 13:56:38.707278       1 main.go:240] load balancer config: ''%!s(MISSING)
I1005 13:56:38.707284       1 main.go:240] metallb:///
I1005 13:56:38.707288       1 main.go:240] facility: 'ewr1'
I1005 13:56:38.707293       1 main.go:240] local ASN: '65000'
I1005 13:56:38.707296       1 main.go:240] Elastic IP Tag: ''
I1005 13:56:38.707300       1 main.go:240] API Server Port: '0'
I1005 13:56:38.707304       1 main.go:240] BGP Node Selector: ''
I1005 13:56:38.707367       1 plugins.go:61] Registered cloud provider "equinixmetal"
Flag --allow-untagged-cloud has been deprecated, This flag is deprecated and will be removed in a future release. A cluster-id will be required on cloud instances.
Flag --allow-untagged-cloud has been deprecated, This flag is deprecated and will be removed in a future release. A cluster-id will be required on cloud instances.
 Installing the ping handler.
I1005 13:56:40.597681       1 healthz.go:162] Installing health checkers for (/healthz): "ping"
I1005 13:56:40.598427       1 tlsconfig.go:200] loaded serving cert ["Generated self signed cert"]: "localhost@1633442199" [serving] validServingFor=[<IP_ADDRESS>,localhost,localhost] issuer="localhost-ca@1633442199" (2021-10-05 12:56:38 +0000 UTC to 2022-10-05 12:56:38 +0000 UTC (now=2021-10-05 13:56:40.598405749 +0000 UTC))
I1005 13:56:40.598595       1 named_certificates.go:53] loaded SNI cert [0/"self-signed loopback"]: "apiserver-loopback-client@1633442200" [serving] validServingFor=[apiserver-loopback-client] issuer="apiserver-loopback-client-ca@1633442200" (2021-10-05 12:56:39 +0000 UTC to 2022-10-05 12:56:39 +0000 UTC (now=2021-10-05 13:56:40.598587948 +0000 UTC))
I1005 13:56:40.598620       1 secure_serving.go:197] Serving securely on [::]:10258
I1005 13:56:40.598633       1 cloud.go:107] called Initialize
I1005 13:56:40.598700       1 tlsconfig.go:240] Starting DynamicServingCertificateController
I1005 13:56:40.598825       1 loadbalancers.go:44] loadBalancers.init(): started
I1005 13:56:40.607950       1 loadbalancers.go:72] loadbalancer implementation enabled: metallb
I1005 13:56:40.607964       1 loadbalancers.go:84] loadBalancers.init(): complete
I1005 13:56:40.607971       1 bgp.go:64] bgp.init(): enabling BGP on project
I1005 13:56:41.036502       1 bgp.go:68] bgp.init(): BGP enabled
I1005 13:56:41.036526       1 eip_controlplane_reconciliation.go:65] controlPlaneEndpointManager.init(): enabling BGP on project
I1005 13:56:41.036541       1 cloud.go:192] called startNodesWatcher
I1005 13:56:41.036548       1 cloud.go:198] startNodesWatcher(): creating nodesInformer
I1005 13:56:41.036568       1 cloud.go:200] startNodesWatcher(): adding event handlers
I1005 13:56:41.036588       1 cloud.go:233] startNodesWatcher(): nodesInformer.Run()
I1005 13:56:41.036607       1 cloud.go:238] startNodesWatcher(): waiting for caches to sync
I1005 13:56:41.036705       1 reflector.go:207] Starting reflector *v1.Node (0s) from pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156
I1005 13:56:41.036724       1 reflector.go:243] Listing and watching *v1.Node from pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156
I1005 13:56:41.038494       1 loadbalancers.go:132] loadbalancers.reconcileNodes(): called for nodes [&Node{ObjectMeta:*******
I1005 13:56:41.038917       1 loadbalancers.go:146] loadbalancers.reconcileNodes(): reconciling add node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:56:41.038927       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://************************************
I1005 13:56:41.136714       1 shared_informer.go:270] caches populated
I1005 13:56:41.136734       1 cloud.go:242] nodes watcher started
I1005 13:56:41.136741       1 cloud.go:249] called startServicesWatcher
I1005 13:56:41.136793       1 cloud.go:288] startServicesWatcher(): servicesInformer.Run()
I1005 13:56:41.136816       1 cloud.go:293] startServicesWatcher(): waiting for caches to sync
I1005 13:56:41.136865       1 reflector.go:207] Starting reflector *v1.Service (0s) from pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156
I1005 13:56:41.136881       1 reflector.go:243] Listing and watching *v1.Service from pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156
I1005 13:56:41.138611       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 0 starting
I1005 13:56:41.138644       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0003e0c00)}
I1005 13:56:41.228097       1 loadbalancers.go:187] loadbalancers.reconcileNodes(): config changed, done
I1005 13:56:41.228118       1 devices.go:266] devices.reconcileNodes(): called for nodes [shoot--core--eqxm-vasu-small-pool-6476c-9zcpr]
I1005 13:56:41.228126       1 devices.go:271] instances.reconcileNodes(): add node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:56:41.228130       1 devices.go:279] instances.reconcileNodes(): setting annotations on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:56:41.236933       1 shared_informer.go:270] caches populated
I1005 13:56:41.236949       1 cloud.go:297] services watcher started
I1005 13:56:41.236957       1 cloud.go:138] Initialize complete
I1005 13:56:41.236966       1 controllermanager.go:244] Starting "cloud-node-lifecycle"
I1005 13:56:41.237216       1 node_lifecycle_controller.go:77] Sending events to api server
I1005 13:56:41.237257       1 cloud.go:150] called Instances
W1005 13:56:41.237267       1 cloud.go:156] The Equinix Metal cloud provider does not support InstancesV2
I1005 13:56:41.237280       1 controllermanager.go:254] Started "cloud-node-lifecycle"
I1005 13:56:41.237287       1 controllermanager.go:244] Starting "service"
I1005 13:56:41.238171       1 cloud.go:144] called LoadBalancer
E1005 13:56:41.238186       1 core.go:97] Failed to start service controller: the cloud provider does not support external load balancers
W1005 13:56:41.238192       1 controllermanager.go:251] Skipping "service"
I1005 13:56:41.238197       1 controllermanager.go:244] Starting "route"
I1005 13:56:41.238206       1 core.go:108] Will not configure cloud provider routes for allocate-node-cidrs: false, configure-cloud-routes: true.
W1005 13:56:41.238211       1 controllermanager.go:251] Skipping "route"
I1005 13:56:41.238218       1 controllermanager.go:244] Starting "cloud-node"
I1005 13:56:41.239157       1 node_controller.go:108] Sending events to api server.
I1005 13:56:41.239194       1 cloud.go:150] called Instances
W1005 13:56:41.239203       1 cloud.go:156] The Equinix Metal cloud provider does not support InstancesV2
I1005 13:56:41.239242       1 controllermanager.go:254] Started "cloud-node"
W1005 13:56:41.240588       1 cloud.go:156] The Equinix Metal cloud provider does not support InstancesV2
I1005 13:56:41.240598       1 cloud.go:150] called Instances
I1005 13:56:41.240603       1 devices.go:65] called NodeAddressesByProviderID with providerID equinixmetal://******************************
I1005 13:56:41.240607       1 devices.go:251] called deviceFromProviderID with providerID equinixmetal://******************************
I1005 13:56:41.240611       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://******************************
I1005 13:56:41.240616       1 devices.go:192] called deviceByID with ID ******************************
I1005 13:56:41.240853       1 reflector.go:207] Starting reflector *v1.Node (15h4m19.638041124s) from pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156
I1005 13:56:41.240868       1 reflector.go:243] Listing and watching *v1.Node from pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156
I1005 13:56:41.240882       1 reflector.go:207] Starting reflector *v1.Service (30s) from pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156
I1005 13:56:41.240893       1 reflector.go:243] Listing and watching *v1.Service from pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156
I1005 13:56:41.242069       1 node_controller.go:320] This node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr is registered without the cloud taint. Will not process.
I1005 13:56:41.242095       1 controller.go:708] Detected change in list of current cluster nodes. New node set: map[shoot--core--eqxm-vasu-small-pool-6476c-9zcpr:{}]
I1005 13:56:41.242120       1 controller.go:716] Successfully updated 0 out of 0 load balancers to direct traffic to the updated set of nodes
E1005 13:56:41.478610       1 devices.go:283] instances.reconcileNodes(): could not get private network info for node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr: GET https://api.equinix.com/metal/v1/devices/equinixmetal:/******************************?include=ip_addresses.parent_block%2Cparent_block%2Cfacility: 404 Not found
I1005 13:56:41.478660       1 devices.go:316] instances.reconcileNodes(): complete
I1005 13:56:41.478668       1 bgp.go:95] bgp.reconcileNodes(): called for nodes [shoot--core--eqxm-vasu-small-pool-6476c-9zcpr]
I1005 13:56:41.478674       1 bgp.go:100] bgp.reconcileNodes(): add node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:56:41.478678       1 bgp.go:106] bgp.reconcileNodes(): enabling BGP on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:56:41.478682       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://******************************
I1005 13:56:41.655978       1 bgp.go:111] bgp.reconcileNodes(): bgp enabled on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:56:41.655999       1 bgp.go:114] bgp.reconcileNodes(): setting annotations on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:56:41.656004       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://******************************
I1005 13:56:41.895406       1 bgp.go:171] bgp.reconcileNodes(): no change to annotations for shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:56:41.895428       1 bgp.go:178] bgp.reconcileNodes(): complete
I1005 13:56:41.895435       1 eip_controlplane_reconciliation.go:77] controlPlaneEndpoint.reconcile: new reconciliation
E1005 13:56:41.895441       1 cloud.go:206] failed to update and sync node for add shoot--core--eqxm-vasu-small-pool-6476c-9zcpr for handler: control plane apiserver port not provided or determined, cannot check, will try again on next loop
I1005 13:56:41.986081       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{}
E1005 13:56:41.986137       1 cloud.go:262] failed to update and sync service for add kube-system/calico-typha-monitoring: elastic ip tag is empty. Nothing to do
I1005 13:56:41.986150       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 0 starting
I1005 13:56:41.986161       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0003e0e10)}
I1005 13:56:42.777103       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{}
E1005 13:56:42.777133       1 cloud.go:262] failed to update and sync service for add kube-system/calico-felix-monitoring: elastic ip tag is empty. Nothing to do
I1005 13:56:42.777158       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 0 starting
I1005 13:56:42.777168       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0003e1020)}
I1005 13:56:43.544906       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{}
E1005 13:56:43.544934       1 cloud.go:262] failed to update and sync service for add kube-system/node-exporter: elastic ip tag is empty. Nothing to do
I1005 13:56:43.544951       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 0 starting
I1005 13:56:43.544958       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0003e1230)}
I1005 13:56:44.296239       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{}
E1005 13:56:44.296260       1 cloud.go:262] failed to update and sync service for add kube-system/kube-dns: elastic ip tag is empty. Nothing to do
I1005 13:56:44.296278       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 0 starting
I1005 13:56:44.296284       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0003e1440)}
I1005 13:56:45.076793       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{}
E1005 13:56:45.076814       1 cloud.go:262] failed to update and sync service for add kube-system/metrics-server: elastic ip tag is empty. Nothing to do
I1005 13:56:45.076830       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 0 starting
I1005 13:56:45.076837       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0003e1650)}
I1005 13:56:45.824902       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{}
E1005 13:56:45.824929       1 cloud.go:262] failed to update and sync service for add kube-system/kube-proxy: elastic ip tag is empty. Nothing to do
I1005 13:56:45.824949       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 0 starting
I1005 13:56:45.824960       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0003e1860)}
I1005 13:56:46.702573       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{}
E1005 13:56:46.702602       1 cloud.go:262] failed to update and sync service for add kube-system/apiserver-proxy: elastic ip tag is empty. Nothing to do
I1005 13:56:46.702623       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 0 starting
I1005 13:56:46.702633       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0003e1a70)}
I1005 13:56:47.526105       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{}
E1005 13:56:47.526129       1 cloud.go:262] failed to update and sync service for add kube-system/blackbox-exporter: elastic ip tag is empty. Nothing to do
I1005 13:56:47.526150       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 0 starting
I1005 13:56:47.526159       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0003e1c80)}
I1005 13:56:48.379350       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{}
E1005 13:56:48.379398       1 cloud.go:262] failed to update and sync service for add kube-system/calico-typha: elastic ip tag is empty. Nothing to do
I1005 13:56:48.379416       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 0 starting
I1005 13:56:48.379428       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0003e1e90)}
I1005 13:56:49.118407       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{}
E1005 13:56:49.118429       1 cloud.go:262] failed to update and sync service for add default/kubernetes: elastic ip tag is empty. Nothing to do
I1005 13:57:11.242476       1 reflector.go:369] pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156: forcing resync
I1005 13:57:41.237173       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 2 starting
I1005 13:57:41.237197       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0003e1440), (*v1.Service)(0xc0003e1650), (*v1.Service)(0xc0003e1c80), (*v1.Service)(0xc0003e1020), (*v1.Service)(0xc0003e1230), (*v1.Service)(0xc0003e1860), (*v1.Service)(0xc0003e1a70), (*v1.Service)(0xc0003e1e90), (*v1.Service)(0xc0003e0c00), (*v1.Service)(0xc0003e0e10)}
I1005 13:57:41.242641       1 reflector.go:369] pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156: forcing resync
I1005 13:57:42.141322       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{}
I1005 13:57:42.141356       1 loadbalancers.go:280] loadbalancer.reconcileServices(): sync: getting all IP reservations
I1005 13:57:42.911419       1 loadbalancers.go:307] loadbalancer.reconcileServices(): sync: valid tags map[]
I1005 13:57:42.911449       1 loadbalancers.go:308] loadbalancer.reconcileServices(): sync: valid svc IPs map[]
I1005 13:57:42.913986       1 metallb.go:86] metallb.SyncServices(): actual configmap IPs []
I1005 13:57:42.914014       1 loadbalancers.go:316] loadbalancer.reconcileServices(): sync: all reservations with emTag []*packngo.IPAddressReservation{}
E1005 13:57:42.914024       1 cloud.go:314] failed to update and sync services: elastic ip tag is empty. Nothing to do
I1005 13:57:42.914036       1 loadbalancers.go:132] loadbalancers.reconcileNodes(): called for nodes [&Node{ObjectMeta:******
I1005 13:57:42.915011       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://******************************
I1005 13:57:43.100474       1 loadbalancers.go:187] loadbalancers.reconcileNodes(): config changed, done
I1005 13:57:43.100493       1 devices.go:266] devices.reconcileNodes(): called for nodes [shoot--core--eqxm-vasu-small-pool-6476c-9zcpr]
I1005 13:57:43.100501       1 devices.go:271] instances.reconcileNodes(): add node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:57:43.100505       1 devices.go:279] instances.reconcileNodes(): setting annotations on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
E1005 13:57:43.237312       1 devices.go:283] instances.reconcileNodes(): could not get private network info for node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr: GET https://api.equinix.com/metal/v1/devices/equinixmetal:/******************************?include=ip_addresses.parent_block%2Cparent_block%2Cfacility: 404 Not found
I1005 13:57:43.237357       1 devices.go:316] instances.reconcileNodes(): complete
I1005 13:57:43.237369       1 bgp.go:95] bgp.reconcileNodes(): called for nodes [shoot--core--eqxm-vasu-small-pool-6476c-9zcpr]
I1005 13:57:43.237377       1 bgp.go:100] bgp.reconcileNodes(): add node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:57:43.237382       1 bgp.go:106] bgp.reconcileNodes(): enabling BGP on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:57:43.237388       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://******************************
I1005 13:57:43.421406       1 bgp.go:111] bgp.reconcileNodes(): bgp enabled on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:57:43.421428       1 bgp.go:114] bgp.reconcileNodes(): setting annotations on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:57:43.421446       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://******************************
I1005 13:57:43.600773       1 bgp.go:171] bgp.reconcileNodes(): no change to annotations for shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:57:43.600794       1 bgp.go:178] bgp.reconcileNodes(): complete
I1005 13:57:43.600802       1 eip_controlplane_reconciliation.go:77] controlPlaneEndpoint.reconcile: new reconciliation
E1005 13:57:43.600807       1 cloud.go:323] failed to update and sync nodes: control plane apiserver port not provided or determined, cannot check, will try again on next loop
I1005 13:57:53.535953       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 0 starting
I1005 13:57:53.535972       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0004c3440)}
I1005 13:57:54.330867       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{}
E1005 13:57:54.330900       1 cloud.go:262] failed to update and sync service for add istio-system/istiod: elastic ip tag is empty. Nothing to do
I1005 13:58:11.242782       1 reflector.go:369] pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156: forcing resync
I1005 13:58:18.051599       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 0 starting
I1005 13:58:18.051619       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0003f2fc0)}
I1005 13:58:19.000302       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{(*v1.Service)(0xc0003f2fc0)}
I1005 13:58:19.000349       1 loadbalancers.go:225] loadbalancer.reconcileServices(): add: service istio-ingressgateway
I1005 13:58:19.000373       1 loadbalancers.go:351] processing istio-system/istio-ingressgateway with existing IP assignment
I1005 13:58:19.000394       1 loadbalancers.go:354] no IP assigned for service istio-system/istio-ingressgateway; searching reservations
I1005 13:58:19.000404       1 loadbalancers.go:360] no IP assignment found for istio-system/istio-ingressgateway, requesting
I1005 13:58:23.196115       1 loadbalancers.go:393] assigning IP <IP_ADDRESS> to istio-system/istio-ingressgateway
I1005 13:58:23.201782       1 loadbalancers.go:407] successfully assigned <IP_ADDRESS> update service istio-system/istio-ingressgateway
I1005 13:58:23.201793       1 event.go:291] "Event occurred" object="istio-system/istio-ingressgateway" kind="Service" apiVersion="v1" type="Normal" reason="LoadbalancerIP" message=" -> <IP_ADDRESS>"
I1005 13:58:23.203712       1 metallb.go:199] mapping IP <IP_ADDRESS>/32
I1005 13:58:23.203728       1 metallb.go:229] config changed, updating
I1005 13:58:23.203865       1 metallb.go:249] patching configmap:
{"data":{"config":"peers:\n- my-asn: 65000\n  peer-asn: 65530\n  peer-address: <IP_ADDRESS>\n  peer-port: 0\n  hold-time: \"\"\n  router-id: \"\"\n  node-selectors:\n  - match-labels:\n      kubernetes.io/hostname: shoot--core--eqxm-vasu-small-pool-6476c-9zcpr\n    match-expressions: []\n  password: \"\"\nbgp-communities: {}\naddress-pools:\n- protocol: bgp\n  name: istio-system/istio-ingressgateway\n  addresses:\n  - <IP_ADDRESS>/32\n  avoid-buggy-ips: false\n  auto-assign: false\n  bgp-advertisements: []\n"}}
E1005 13:58:23.206962       1 cloud.go:262] failed to update and sync service for add istio-system/istio-ingressgateway: elastic ip tag is empty. Nothing to do
I1005 13:58:41.242958       1 reflector.go:369] pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156: forcing resync
I1005 13:58:43.600979       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 2 starting
I1005 13:58:43.601060       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0004c3440), (*v1.Service)(0xc000015440), (*v1.Service)(0xc0003e0c00), (*v1.Service)(0xc0003e0e10), (*v1.Service)(0xc0003e1860), (*v1.Service)(0xc0003e1a70), (*v1.Service)(0xc0003e1e90), (*v1.Service)(0xc0003e1020), (*v1.Service)(0xc0003e1230), (*v1.Service)(0xc0003e1440), (*v1.Service)(0xc0003e1650), (*v1.Service)(0xc0003e1c80)}
I1005 13:58:44.642151       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{(*v1.Service)(0xc000015440)}
I1005 13:58:44.642175       1 loadbalancers.go:271] loadbalancer.reconcileServices(): sync: service istio-ingressgateway
I1005 13:58:44.642189       1 loadbalancers.go:351] processing istio-system/istio-ingressgateway with existing IP assignment <IP_ADDRESS>
I1005 13:58:44.644663       1 metallb.go:199] mapping IP <IP_ADDRESS>/32
I1005 13:58:44.644684       1 metallb.go:223] address already on ConfigMap, unchanged
I1005 13:58:44.644697       1 loadbalancers.go:280] loadbalancer.reconcileServices(): sync: getting all IP reservations
I1005 13:58:45.490171       1 loadbalancers.go:307] loadbalancer.reconcileServices(): sync: valid tags map[service=NiN8iRoN5ip1NIbo0soMgUZ9sfQqJ8KFBfYiCSf0KyA=:true]
I1005 13:58:45.490202       1 loadbalancers.go:308] loadbalancer.reconcileServices(): sync: valid svc IPs map[<IP_ADDRESS>/32:true]
I1005 13:58:45.493867       1 metallb.go:86] metallb.SyncServices(): actual configmap IPs [<IP_ADDRESS>/32]
I1005 13:58:45.493888       1 loadbalancers.go:316] loadbalancer.reconcileServices(): sync: all reservations with emTag []*packngo.IPAddressReservation{(*packngo.IPAddressReservation)(0xc000c64c00)}
E1005 13:58:45.493900       1 cloud.go:314] failed to update and sync services: elastic ip tag is empty. Nothing to do
I1005 13:58:45.493911       1 loadbalancers.go:132] loadbalancers.reconcileNodes(): called for nodes [&Node{ObjectMeta:*****
I1005 13:58:45.494297       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://******************************
I1005 13:58:45.717343       1 loadbalancers.go:187] loadbalancers.reconcileNodes(): config changed, done
I1005 13:58:45.717369       1 devices.go:266] devices.reconcileNodes(): called for nodes [shoot--core--eqxm-vasu-small-pool-6476c-9zcpr]
I1005 13:58:45.717378       1 devices.go:271] instances.reconcileNodes(): add node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:58:45.717383       1 devices.go:279] instances.reconcileNodes(): setting annotations on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
E1005 13:58:45.892014       1 devices.go:283] instances.reconcileNodes(): could not get private network info for node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr: GET https://api.equinix.com/metal/v1/devices/equinixmetal:/******************************?include=ip_addresses.parent_block%2Cparent_block%2Cfacility: 404 Not found
I1005 13:58:45.892047       1 devices.go:316] instances.reconcileNodes(): complete
I1005 13:58:45.892058       1 bgp.go:95] bgp.reconcileNodes(): called for nodes [shoot--core--eqxm-vasu-small-pool-6476c-9zcpr]
I1005 13:58:45.892066       1 bgp.go:100] bgp.reconcileNodes(): add node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:58:45.892070       1 bgp.go:106] bgp.reconcileNodes(): enabling BGP on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:58:45.892074       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://******************************
I1005 13:58:46.085877       1 bgp.go:111] bgp.reconcileNodes(): bgp enabled on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:58:46.085893       1 bgp.go:114] bgp.reconcileNodes(): setting annotations on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:58:46.085898       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://******************************
I1005 13:58:46.293152       1 bgp.go:171] bgp.reconcileNodes(): no change to annotations for shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 13:58:46.293172       1 bgp.go:178] bgp.reconcileNodes(): complete
I1005 13:58:46.293191       1 eip_controlplane_reconciliation.go:77] controlPlaneEndpoint.reconcile: new reconciliation
E1005 13:58:46.293197       1 cloud.go:323] failed to update and sync nodes: control plane apiserver port not provided or determined, cannot check, will try again on next loop

[x] Step 3: Set the service to ClusterIP instead of LoadBalancer

I1005 14:05:02.942705       1 eip_controlplane_reconciliation.go:77] controlPlaneEndpoint.reconcile: new reconciliation
E1005 14:05:02.942710       1 cloud.go:323] failed to update and sync nodes: control plane apiserver port not provided or determined, cannot check, will try again on next loop
I1005 14:05:11.245065       1 reflector.go:369] pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156: forcing resync
I1005 14:05:11.917512       1 event.go:291] "Event occurred" object="istio-system/istio-ingressgateway" kind="Service" apiVersion="v1" type="Normal" reason="Type" message="LoadBalancer -> ClusterIP"
I1005 14:05:41.245235       1 reflector.go:369] pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156: forcing resync
I1005 14:05:50.142652       1 reflector.go:515] pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156: Watch close - *v1.Service total 16 items received
I1005 14:06:02.942839       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 2 starting
I1005 14:06:02.942864       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0003e0c00), (*v1.Service)(0xc0003e0e10), (*v1.Service)(0xc0003e1860), (*v1.Service)(0xc0003e1a70), (*v1.Service)(0xc0003e1e90), (*v1.Service)(0xc0004c3440), (*v1.Service)(0xc0003f98c0), (*v1.Service)(0xc0003e1020), (*v1.Service)(0xc0003e1230), (*v1.Service)(0xc0003e1440), (*v1.Service)(0xc0003e1650), (*v1.Service)(0xc0003e1c80)}
I1005 14:06:03.891325       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{}
I1005 14:06:03.891349       1 loadbalancers.go:280] loadbalancer.reconcileServices(): sync: getting all IP reservations
I1005 14:06:04.682832       1 loadbalancers.go:307] loadbalancer.reconcileServices(): sync: valid tags map[]
I1005 14:06:04.682853       1 loadbalancers.go:308] loadbalancer.reconcileServices(): sync: valid svc IPs map[]
I1005 14:06:04.685103       1 metallb.go:86] metallb.SyncServices(): actual configmap IPs [<IP_ADDRESS>/32]
I1005 14:06:04.685119       1 metallb.go:89] metallb.SyncServices(): removing from configmap ip <IP_ADDRESS>/32 not in valid list
I1005 14:06:04.685125       1 metallb.go:205] unmapping IP <IP_ADDRESS>/32
I1005 14:06:04.685131       1 metallb.go:229] config changed, updating
I1005 14:06:04.685211       1 metallb.go:249] patching configmap:
{"data":{"config":"peers:\n- my-asn: 65000\n  peer-asn: 65530\n  peer-address: <IP_ADDRESS>\n  peer-port: 0\n  hold-time: \"\"\n  router-id: \"\"\n  node-selectors:\n  - match-labels:\n      kubernetes.io/hostname: shoot--core--eqxm-vasu-small-pool-6476c-9zcpr\n    match-expressions: []\n  password: \"\"\nbgp-communities: {}\naddress-pools: []\n"}}
I1005 14:06:04.688321       1 loadbalancers.go:316] loadbalancer.reconcileServices(): sync: all reservations with emTag []*packngo.IPAddressReservation{(*packngo.IPAddressReservation)(0xc000553800)}
I1005 14:06:04.688342       1 loadbalancers.go:326] loadbalancer.reconcileServices(): sync: removing reservation with service= tag but not in validTags list &packngo.IPAddressReservation{IpAddressCommon:packngo.IpAddressCommon{ID:"3b802032-0caf-476f-81af-048662d4000c", Address:"<IP_ADDRESS>", Gateway:"<IP_ADDRESS>", Network:"<IP_ADDRESS>", AddressFamily:4, Netmask:"<IP_ADDRESS>", Public:true, CIDR:32, Created:"2021-10-05T13:58:19Z", Updated:"", Href:"/metal/v1/ips/3b802032-0caf-476f-81af-048662d4000c", Management:false, Manageable:true, Metro:(*packngo.Metro)(0xc000ba7000), Project:packngo.Href{Href:"/metal/v1/projects/**********************************"}, Global:false, Tags:[]string{"usage=cloud-provider-equinix-metal-auto", "service=NiN8iRoN5ip1NIbo0soMgUZ9sfQqJ8KFBfYiCSf0KyA=", "cluster=4f488f72-f385-4023-af32-99d0ba2424c1"}, ParentBlock:(*packngo.ParentBlock)(nil), CustomData:map[string]interface {}{}}, Assignments:[]*packngo.IPAddressAssignment{}, Facility:(*packngo.Facility)(0xc0001ab1f0), Available:"/metal/v1/ips/3b802032-0caf-476f-81af-048662d4000c/available", Addon:true, Bill:true, Description:(*string)(0xc00062c230)}
E1005 14:06:07.882396       1 cloud.go:314] failed to update and sync services: elastic ip tag is empty. Nothing to do
I1005 14:06:07.882426       1 loadbalancers.go:132] loadbalancers.reconcileNodes(): called for nodes [&Node{ObjectMeta:****
I1005 14:06:07.882778       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://*************************
I1005 14:06:08.149592       1 loadbalancers.go:187] loadbalancers.reconcileNodes(): config changed, done
I1005 14:06:08.149612       1 devices.go:266] devices.reconcileNodes(): called for nodes [shoot--core--eqxm-vasu-small-pool-6476c-9zcpr]
I1005 14:06:08.149620       1 devices.go:271] instances.reconcileNodes(): add node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 14:06:08.149624       1 devices.go:279] instances.reconcileNodes(): setting annotations on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
E1005 14:06:08.310809       1 devices.go:283] instances.reconcileNodes(): could not get private network info for node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr: GET https://api.equinix.com/metal/v1/devices/equinixmetal:/*************************?include=ip_addresses.parent_block%2Cparent_block%2Cfacility: 404 Not found
I1005 14:06:08.310838       1 devices.go:316] instances.reconcileNodes(): complete
I1005 14:06:08.310847       1 bgp.go:95] bgp.reconcileNodes(): called for nodes [shoot--core--eqxm-vasu-small-pool-6476c-9zcpr]
I1005 14:06:08.310853       1 bgp.go:100] bgp.reconcileNodes(): add node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 14:06:08.310857       1 bgp.go:106] bgp.reconcileNodes(): enabling BGP on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 14:06:08.310861       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://*************************
I1005 14:06:08.530887       1 bgp.go:111] bgp.reconcileNodes(): bgp enabled on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 14:06:08.530908       1 bgp.go:114] bgp.reconcileNodes(): setting annotations on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 14:06:08.530913       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://*************************
I1005 14:06:08.755257       1 bgp.go:171] bgp.reconcileNodes(): no change to annotations for shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 14:06:08.755279       1 bgp.go:178] bgp.reconcileNodes(): complete
I1005 14:06:08.755286       1 eip_controlplane_reconciliation.go:77] controlPlaneEndpoint.reconcile: new reconciliation
E1005 14:06:08.755291       1 cloud.go:323] failed to update and sync nodes: control plane apiserver port not provided or determined, cannot check, will try again on next loop
I1005 14:06:11.245401       1 reflector.go:369] pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156: forcing resync
I1005 14:06:41.245599       1 reflector.go:369] pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156: forcing resync
W1005 14:06:42.418782       1 cloud.go:156] The Equinix Metal cloud provider does not support InstancesV2
I1005 14:06:42.418801       1 cloud.go:150] called Instances
I1005 14:06:42.418809       1 devices.go:65] called NodeAddressesByProviderID with providerID equinixmetal://*************************
I1005 14:06:42.418815       1 devices.go:251] called deviceFromProviderID with providerID equinixmetal://*************************
I1005 14:06:42.418821       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://*************************
I1005 14:06:42.418827       1 devices.go:192] called deviceByID with ID *************************

[x] Step 4: Set the service to back to LoadBalancer

I1005 14:11:43.137869       1 devices.go:192] called deviceByID with ID *********
I1005 14:11:55.514561       1 event.go:291] "Event occurred" object="istio-system/istio-ingressgateway" kind="Service" apiVersion="v1" type="Normal" reason="Type" message="ClusterIP -> LoadBalancer"
I1005 14:12:11.248064       1 reflector.go:369] pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156: forcing resync
I1005 14:12:24.044202       1 reflector.go:515] pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156: Watch close - *v1.Node total 56 items received
I1005 14:12:24.671761       1 loadbalancers.go:197] loadbalancer.reconcileServices(): 2 starting
I1005 14:12:24.671783       1 loadbalancers.go:198] loadbalancer.reconcileServices(): services []*v1.Service{(*v1.Service)(0xc0003e1020), (*v1.Service)(0xc0003e1230), (*v1.Service)(0xc0003e1440), (*v1.Service)(0xc0003e1650), (*v1.Service)(0xc0003e1c80), (*v1.Service)(0xc0003e0c00), (*v1.Service)(0xc0003e0e10), (*v1.Service)(0xc0003e1860), (*v1.Service)(0xc0003e1a70), (*v1.Service)(0xc0003e1e90), (*v1.Service)(0xc0004c3440), (*v1.Service)(0xc0006d18c0)}
I1005 14:12:26.219336       1 loadbalancers.go:219] loadbalancer.reconcileServices(): valid services []*v1.Service{(*v1.Service)(0xc0006d18c0)}
I1005 14:12:26.219368       1 loadbalancers.go:271] loadbalancer.reconcileServices(): sync: service istio-ingressgateway
I1005 14:12:26.219388       1 loadbalancers.go:351] processing istio-system/istio-ingressgateway with existing IP assignment <IP_ADDRESS>
I1005 14:12:26.222139       1 metallb.go:199] mapping IP <IP_ADDRESS>/32
I1005 14:12:26.222155       1 metallb.go:229] config changed, updating
I1005 14:12:26.222282       1 metallb.go:249] patching configmap:
{"data":{"config":"peers:\n- my-asn: 65000\n  peer-asn: 65530\n  peer-address: <IP_ADDRESS>\n  peer-port: 0\n  hold-time: \"\"\n  router-id: \"\"\n  node-selectors:\n  - match-labels:\n      kubernetes.io/hostname: shoot--core--eqxm-vasu-small-pool-6476c-9zcpr\n    match-expressions: []\n  password: \"\"\nbgp-communities: {}\naddress-pools:\n- protocol: bgp\n  name: istio-system/istio-ingressgateway\n  addresses:\n  - <IP_ADDRESS>/32\n  avoid-buggy-ips: false\n  auto-assign: false\n  bgp-advertisements: []\n"}}
I1005 14:12:26.225306       1 loadbalancers.go:280] loadbalancer.reconcileServices(): sync: getting all IP reservations
I1005 14:12:27.051260       1 loadbalancers.go:307] loadbalancer.reconcileServices(): sync: valid tags map[service=NiN8iRoN5ip1NIbo0soMgUZ9sfQqJ8KFBfYiCSf0KyA=:true]
I1005 14:12:27.051286       1 loadbalancers.go:308] loadbalancer.reconcileServices(): sync: valid svc IPs map[]
I1005 14:12:27.053340       1 metallb.go:86] metallb.SyncServices(): actual configmap IPs [<IP_ADDRESS>/32]
I1005 14:12:27.053356       1 metallb.go:89] metallb.SyncServices(): removing from configmap ip <IP_ADDRESS>/32 not in valid list
I1005 14:12:27.053361       1 metallb.go:205] unmapping IP <IP_ADDRESS>/32
I1005 14:12:27.053366       1 metallb.go:229] config changed, updating
I1005 14:12:27.053443       1 metallb.go:249] patching configmap:
{"data":{"config":"peers:\n- my-asn: 65000\n  peer-asn: 65530\n  peer-address: <IP_ADDRESS>\n  peer-port: 0\n  hold-time: \"\"\n  router-id: \"\"\n  node-selectors:\n  - match-labels:\n      kubernetes.io/hostname: shoot--core--eqxm-vasu-small-pool-6476c-9zcpr\n    match-expressions: []\n  password: \"\"\nbgp-communities: {}\naddress-pools: []\n"}}
I1005 14:12:27.055838       1 loadbalancers.go:316] loadbalancer.reconcileServices(): sync: all reservations with emTag []*packngo.IPAddressReservation{}
E1005 14:12:27.055858       1 cloud.go:314] failed to update and sync services: elastic ip tag is empty. Nothing to do
I1005 14:12:27.055868       1 loadbalancers.go:132] loadbalancers.reconcileNodes(): called for nodes [&Node{ObjectMeta:*******
I1005 14:12:27.056246       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://*********
I1005 14:12:27.279014       1 loadbalancers.go:187] loadbalancers.reconcileNodes(): config changed, done
I1005 14:12:27.279041       1 devices.go:266] devices.reconcileNodes(): called for nodes [shoot--core--eqxm-vasu-small-pool-6476c-9zcpr]
I1005 14:12:27.279053       1 devices.go:271] instances.reconcileNodes(): add node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 14:12:27.279059       1 devices.go:279] instances.reconcileNodes(): setting annotations on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
E1005 14:12:27.761095       1 devices.go:283] instances.reconcileNodes(): could not get private network info for node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr: GET https://api.equinix.com/metal/v1/devices/equinixmetal:/*********?include=ip_addresses.parent_block%2Cparent_block%2Cfacility: 404 Not found
I1005 14:12:27.761127       1 devices.go:316] instances.reconcileNodes(): complete
I1005 14:12:27.761137       1 bgp.go:95] bgp.reconcileNodes(): called for nodes [shoot--core--eqxm-vasu-small-pool-6476c-9zcpr]
I1005 14:12:27.761143       1 bgp.go:100] bgp.reconcileNodes(): add node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 14:12:27.761147       1 bgp.go:106] bgp.reconcileNodes(): enabling BGP on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 14:12:27.761151       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://*********
I1005 14:12:27.974992       1 bgp.go:111] bgp.reconcileNodes(): bgp enabled on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 14:12:27.975012       1 bgp.go:114] bgp.reconcileNodes(): setting annotations on node shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 14:12:27.975017       1 devices.go:227] called deviceIDFromProviderID with providerID equinixmetal://*********
I1005 14:12:28.209201       1 bgp.go:171] bgp.reconcileNodes(): no change to annotations for shoot--core--eqxm-vasu-small-pool-6476c-9zcpr
I1005 14:12:28.209223       1 bgp.go:178] bgp.reconcileNodes(): complete
I1005 14:12:28.209230       1 eip_controlplane_reconciliation.go:77] controlPlaneEndpoint.reconcile: new reconciliation
E1005 14:12:28.209235       1 cloud.go:323] failed to update and sync nodes: control plane apiserver port not provided or determined, cannot check, will try again on next loop
I1005 14:12:41.248233       1 reflector.go:369] pkg/mod/k8s.io/client-go@v0.19.4/tools/cache/reflector.go:156: forcing resync

I am fairly confident that #224 eliminates this issue. As we switched to the standard load balancer API, everything happens via:
EnsureLoadBalancer(ctx context.Context, clusterName string, service *v1Service, nodes []*v1.Node) (*v1.LoadBalancerStatus, error)

which is implemented here.
We no longer look at the spec or loadbalancerIP; it just gets a call EnsureLoadBalancer(), and it sees if one is assigned in EQXM. If yes, pass it on; if not, create one.
I will close the issue, but feel free to open if it can be reproduced with the latest.


Web component: Filter Panel - 'Clear' option is appearing at the top of Filter.

The problem
Issue:
By default clear option is not available then after selecting filter
Clear option is appearing at the top of the filter, which makes the screen reader user to come back to top to clear it.
Sometimes users wont know about this clear option available until they come back to top and verify.
The solution
Additional information

This is a design/accessibility question. Placement of the clear button would be more ideal possibly at the bottom or to show a disabled button at the top, which becomes enabled once things are selected.

This is for the tablet and mobile breakpoints where screen reader users would not necessarily know there is a clear function until they get to the bottom of the filter panel. Ideal in all screen sizes is to tab through the disabled Clear button (this way, users knows this is available) before getting to filter options.

@jeffchew It looks like this issue is in Pending Scheduling, but it is a Feature Request without a sizing.  I have added it to the July 26 issues refinement agenda and moved back to the "To be Traiged" pipeline.

@shixiedesign Could you review this with the designers?  Thanks.

@Praveen-sr
Design team reviewed together and decided this is not a feature we should add at this time. Reasons being:

if we move the "Clear" button to the bottom of the panel, keyboard users still have to move through a lot of key strokes, and users with 400% zoom will still not see it appearing
we cannot move "Clear" to each individual accordions because it would interfere with Carbon accordion, which makes the whole bar area clickable. To add a button there we'd have to create a new accordion component
Upon filtering, we expect the focus to move to content. So if filters need to be adjusted, it's a back-tracking logic to look for filter panel already, so hopefully it won't be hard to find the "Clear" button.

That said, I think we should all keep our eyes and ears open for alternative solutions. Please let us know if anything  we didn't think of.

Moving to Icebox, based on Shixie's comments above.

Added above design decision / logic into Filter panel design spec. Closing. ![image.png]
(https://images.zenhubusercontent.com/5be09c3a6102900c6d16d991/fe920f53-9464-4b32-9891-3cb2fd21afef)


[🆕] Webview error state

📲 What
Displaying a retry page for webviews that encounter an error (like no service).
🤔 Why
The current implementation crashes the app when the user tries to load a webview with no service and I want to be better.
🛠 How

Updated strings
Previously, every Activity with a Webview implemented KSWebViewClient.Delegate when they might not have needed to.
KSWebView is now a FrameLayout that contains a Webview, ProgressBar and retry layout. The KSWebViewClient's Delegate is now this parent view. KSWebView also has its own Delegate if any screen is so inclined.

👀 See

Before 🐛
After 🦋

📋 QA
Engineers only: You need to update the code in KSWebViewClient to run this branch.
1⃣ Open a project page. Turn on Airplane Mode. Navigate to any of our lovely screens with webviews: Checkout, Project Updates, Campaign, Creator Bio, Help pages (if you don't have Chrome).
Story 📖
Trello Story

 Not crashing the app when a webview network call fails


Converted nearby list to recycler view

Changes on this PR

Converted the "nearby" list to use a RecyclerView utilizing the excellent "Renderers" library (Apache 2.0 license).
Unit tested the new list implementation using Robolectric,
Ran static code analysis on the "nearby" package and cleaned up the small issues noted.
Deleted dead code.

This PR covers one step for Issue #743 (replace listviews)

Codecov Report

:exclamation: No coverage uploaded for pull request base (master@31b12ba). Click here to learn what that means.
The diff coverage is 45.09%.

@@           Coverage Diff            @@
##             master    #766   +/-   ##
========================================
  Coverage          ?   6.25%
========================================
  Files             ?      93
  Lines             ?    5033
  Branches          ?     455
========================================
  Hits              ?     315
  Misses            ?    4693
  Partials          ?      25

Impacted Files
Coverage Δ

.../java/fr/free/nrw/commons/nearby/NearbyMarker.java
0% <ø> (ø)

...ava/fr/free/nrw/commons/nearby/NearbyActivity.java
42.75% <ø> (ø)

.../fr/free/nrw/commons/nearby/NearbyMapFragment.java
0% <ø> (ø)

...rc/main/java/fr/free/nrw/commons/nearby/Place.java
60.37% <ø> (ø)

.../java/fr/free/nrw/commons/nearby/NearbyPlaces.java
0% <0%> (ø)

...a/fr/free/nrw/commons/nearby/NearbyInfoDialog.java
0% <0%> (ø)

...a/fr/free/nrw/commons/nearby/NearbyBaseMarker.java
0% <0%> (ø)

...java/fr/free/nrw/commons/nearby/PlaceRenderer.java
15% <15%> (ø)

...fr/free/nrw/commons/nearby/NearbyListFragment.java
88.88% <86.66%> (ø)

.../free/nrw/commons/nearby/NearbyAdapterFactory.java
87.5% <87.5%> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 31b12ba...9387d31. Read the comment docs.

Looks good to me! Assuming the others are okay with the new library? @whym @nicolas-raoul

At 16 KB it sounds acceptable :-)
https://mvnrepository.com/artifact/com.github.pedrovgs/renderers/3.3.0
On Mon, Jul 10, 2017 at 5:50 PM, Josephine Lim<EMAIL_ADDRESS>wrote:

Looks good to me! Assuming the others are okay with the new library? @whym
https://github.com/whym @nicolas-raoul
https://github.com/nicolas-raoul
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
https://github.com/commons-app/apps-android-commons/pull/766#issuecomment-314045084,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AAGFBjIauc8Jy9YMZzzDP_OZZVTU-Iinks5sMeXtgaJpZM4OSNg_
.

At 16 KB it sounds acceptable :-)
https://mvnrepository.com/artifact/com.github.pedrovgs/renderers/3.3.0

Does this number include the size of its transitive dependencies?
Anyway, when I checked the change in the size of the release APK, it was from 19350346 to 19354766 - so size-wise it seems actually fine.

Thanks guys! I tested this and it works well for me. Will merge soon if no one has any issues with it.


correctly handle dtypes when reading text attributes

pandas will infer dtype for us, and in most cases this is great. however, for some cards, like subcatchments/junctions/conduits/links the index is the name of the element. When we allow pandas to naively infer the dtype of the index we get inconsistent results, even in models that run fine in SWMM.
consider the folowing recent example:
inp = hymo.SWMMInpFile(swmm_inp_path)
assert all([isinstance(i, str) for i in inp.subcatchments.index])
>>>True
all([isinstance(i, str) for i in inp.polygons.index])
>>>False

the polygons should map one to one with my subcatchments, but they do not since their types are wrong. In fact, it's worse than being opposite; the types on the index of the inp.polygons are actually mixed, and not all one or the other.
Proper SWMM string-type coercion PR forthcoming.

closing since this got merged.


chore(*): update osm install demo

Description:
Updates OSM install demo and links in README.md
Resolves #2279
Signed-off-by: Shalier Xia<EMAIL_ADDRESS>
Testing done:

Affected area:

Functional Area

Demo
[x ]

Documentation
[x ]

Please answer the following questions with yes/no.

Does this change contain code from or inspired by another project?no

Did you notify the maintainers and provide attribution?

Is this a breaking change?no

Codecov Report

Merging #4114 (3415168) into main (5e9a349) will increase coverage by 0.05%.
The diff coverage is n/a.

@@            Coverage Diff             @@
##             main    #4114      +/-   ##
==========================================
+ Coverage   69.12%   69.18%   +0.05%
==========================================
  Files         205      205
  Lines       11240    11240
==========================================
+ Hits         7770     7776       +6
+ Misses       3418     3412       -6
  Partials       52       52

Flag
Coverage Δ

unittests
69.18% <ø> (+0.05%)
:arrow_up:

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files
Coverage Δ

pkg/providers/kube/client.go
71.68% <0.00%> (+0.88%)
:arrow_up:

pkg/crdconversion/crdconversion.go
75.00% <0.00%> (+5.43%)
:arrow_up:

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 5e9a349...3415168. Read the comment docs.


Use BDK-maintained SQLite

This allows us to persist floating txouts and has backwards compatibility built in.

 Persist floating txouts.


Pull Request descriptions being edited by Jira

It seems like there was a recent change that was introduced which is constantly editing our pull request descriptions. It looks like something is pattern matching the ticket format and then appending a (poorly formatted imo) bit of text at the end.
A few issues with this. We squash our PRs and merge in the description of the PR as the commit message. We also use git trailers which are expected to be at the end of the commit. The bot appending it's own information at the end messes with this.
Another thing... it doesn't even work correctly. We have a PR template which contains docblocks explaining parts of the template. This is the explanation on using git trailers along with the ticket for the PR that I added, and the line that the bot injected.
## Context

<!--
Use commit trailers to add additional context such as the assigned Jira ticket, related Jira tickets, and related Github Pull Requests.

https://git-scm.com/docs/git-interpret-trailers

Example:
related-to: MW-1234
related-to: resideo/lantern_flutter#<pr number>
ticket: MW-5678
-->

ticket: MW-6010

[MW-1234]: https://resideo.atlassian.net/browse/MW-1234?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

As you can see the [MW-1234]: http://resideo... bit at the end was injected because it picked up the fake/example ticket number from ticket: MW-1234 which is in a docblock. The real ticket was MW-6010 which was in the proper place for the trailer until the Jira integration comes stomping through.
Is there anyway to turn this behavior off?

Hi @nicholasspencer , we did recently push a fix for correcting the links to the Jira issue tickets in GitHub's PR. That is probably whats causing this behaviour.
I will look into this and have it resolved quickly.

@nicholasspencer
The fix has been merged and will be deployed soon. Please test it again.

Looks like that did the trick. Thank you very much!

Seems like this is happening again.

Happening for us as well

And again...

#happeningagain

And again. Please add an integration test to prevent this behavior or add a flag or something to the GitHub app to turn this on and off...

Same issue here… very annoying to not even have options to disable this. As we already have set up Autolink References

I'm having the same issue, in even weirder way.
I'm using Jira Automation Rule to automatically create pull requests in GitHub. The Jira Automation Rule sends a web request to GitHub REST API endpoint (https://api.github.com/repos/$org/$repo/pulls) with this custom data -
{
    "title": "{{issue.key}}: PR to qa",
    "body": "PR auto-created from Jira Issue [{{issue.key}}]({{issue.url}})",
    "head": "feature/{{issue.key}}",
    "base": "qa"
}

The pull request is getting created fine. But immediately afterwards, the jira (bot) is editing the PR body, to add some hidden code to it. Body looks same before and after the editing done by jira (bot) -

PR auto-created from Jira Issue EXMPL-12345

But when I check the source code of body after jira (bot)'s editing, looks like it adds a second line to it -
Body source code after Jira (bot) edits it -
PR auto-created from Jira Issue [EXMPL-12345](https://myorg.atlassian.net/browse/EXMPL-12345)

[EXMPL-12345]: https://myorg.atlassian.net/browse/EXMPL-12345?atlOrigin=loNgAlphaNumericStringHere

I dislike this behavior, because we have CI jobs configured in GitHub that get triggered when a PR is edited. So, this behavior of the jira (bot) is unnecessarily triggering those CI jobs.
I need to stop this. Please let me know how.

Can confirm it's happening with issue and PR descriptions.

We also experienced this issue. We use renovate to update dependencies. It creates pull requests that get edited by github-for-jira. Renovate does not like the edits and reverts all the changes with another edit. THen github-fot-jira edits again and we end up with hundreds of edits. :(

Hey, folks.
We're experiencing this too. In our case we run some jobs on PRs being opened, edited, synchronized. So when jira bot edits the PR it triggers redundant job execution, which in turn costs us money/resources.

We're getting this as well.
Would really like there to be a Jira -> GitHub "read only" mode that could be set at an instance/project level.
Love that Jira can associate pull requests with Jira tickets/etc. - but I in no way want Jira messing with our GitHub state. Hate this.

I think this is really widespread just a few folks noticing it since there is no clear indication other than last edit by jira bot. Would really like to know what is happening here.


playing delay in [player~]

https://github.com/user-attachments/assets/c6b57034-02ef-414d-98bb-f3cca129a10d
https://github.com/user-attachments/assets/627f8506-1577-4bd9-859d-35bf8ad26fbc
hello. I was going to play my files in [player~], while alternating files in one object. but each time I change and play my files, there is a little latency and delay. but I'm not sure whether this is a bug or just a problem with my computer. (but at least it was fine when doing the same thing in [readsf~]) - tested in both plug and vanilla / Win11
mypatch: https://drive.google.com/file/d/1I-ZXZZTLykAWYyaCdW-tPTemzNoy7Ifr/view?usp=sharing

please don't send a patch with over half a gigabyte :)
I don't know how to work with this patch and it looks pretty weird when opening in vanilla, things are too big
try to send a minimal patch that shows the behaviour to see if I can reproduce. Something that compares readsf~ and player~ with a small sample would be nice.  You can also just upload the patch as a zip file here in the comment

hi. sorry for the inconvenience. here is more simple patch. would this help? https://drive.google.com/file/d/176H2fkcj_ayyXuzPfrNoXIjz6aW4XZvi/view?usp=sharing

what I also found was when I play the file through player~, the console window in vanilla shows the error message "Audio I/O Error". while not in readsf~

I don't see much of a difference in your patch example, but I think I see what is going on
note that [player~] is not supposed to be an alternative to readsf~
I already explained that on a facebook post
player~ loads files into tables and your files are big, this is why you see the CPU choking with errors
the play.file~ object is a replacement to readsf~
so if you don't need special features from player~ you should use play.file~ or readsf~ for very large files, or you need to preload these samples into tables and use [tabplayer~] to access different files

Ok so I understood that this might be a size problem. Will try [play.file~] too. Thanks!


Wheelio false positives

Platform
Which platform does the bug apply to?

WebExtension (Google Chrome, Mozilla Firefox)

Describe the bug
The widget Wheelio appears to be used on every site.
To Reproduce
Steps to reproduce the behavior:

Go on every sites (github.com, gmail.com, google.com, realpython.com, every sites)
Click on Wappalyzer

Expected behavior
I don't know so much about Wheelio but I doubt that it is used on all the internet, so the expectation is that it shouldn't appear on all sites.

@mxrch - Thanks for raising this. This has been addressed as part of https://github.com/AliasIO/wappalyzer/issues/4550.


Use of source code

You should add a notice to the license from github.com/TheCommCraft/scratchcommunication because you used part of the source code.

Uhm, what?

It just looks like you used a modified version of https://github.com/TheCommCraft/scratchcommunication/blob/main/scratchcommunication/cloud.py

Still not resolved...

https://scratch.mit.edu/projects/877978019/#comments-351170928 ...

You didn't change anything
programORdie2 @.***> schrieb am Fr., 25. Aug. 2023,
21:47:

https://scratch.mit.edu/projects/877978019/#comments-351170928 ...
—
Reply to this email directly, view it on GitHub
https://github.com/programORdie2/scratchrequest/issues/1#issuecomment-1693856191,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ATCKMZWF5GVNSFKK7BRCXXLXXD6OJANCNFSM6AAAAAA3OR6CN4
.
You are receiving this because you authored the thread.Message ID:
@.***>

I have already credited you in the cloud scripts, but what exactly should I put in the LICENSE? Or would you rather I delete the entire cloud? (as well for me)

I have already credited you in the cloud scripts, but what exactly should I put in the LICENSE? Or would you rather I delete the entire cloud? (as well for me)

That's ok

Okay, the next time i work on the README.md, i'll credit you there to.


Improve dirty terminal editor wording

I think we need hooks in editor land for this. Save should not be shown as an option.

The area owners probably need to help here as it's not the easiest UX problem to work through; what do we do with the save button? What if there are editors and terminals?

Feedback from UX sync:

It's not a dirty file, so don't mark it as dirty - opinions are somewhat split on this
Maybe have a different type of indicator, but probably not needed. I don't think other terminals have indicators for child processes
Have a totally separate close dialog for terminals in parts/terminal

Have a totally separate close dialog for terminals in parts/terminal

Probably better to just have a separate part for terminal editors as we don't want to double dialog people.
Also I'm going to move this work to August as Ben is out and I don't want to make any large changes to editor closing without him around to review.

@lramos15 well there is already a terminal-specific shutdown veto that may show up as well if you opt into the setting. We could consider somehow merging those two if possible but closing a single terminal would never double prompt

It's not a dirty file, so don't mark it as dirty - opinions are somewhat split on this

At first I felt the same, we shouldn't use the same dirty indication as for file based editors, especially since on macOS we mark a window as "edited" for dirty editors, but then I noticed how macOS does the same for terminals when a process is running:

And closing that tab shows a dialog:

So maybe using the same dirty indication is not so bad after all.
However I think showing a combined dialog might not be so user friendly, so I would probably go for another modal dialog after having dealt with dirty editors.
I think having a UX discussion with some proposals would help to move forward before we make a decision and implement this.


Separate Dictionary sets by language

I am looking at Forgery for creating fake data. The data I am creating will not be in English (And not using a western alphabet).
In the short term I will just override the dictionaries in my app but in future it would be great if we could namespace the dictionaries by language and build up a multi-lingual + alphabet forgery library.

Hello I had the same issue, but I was created a new gem as Forgery extension: https://github.com/internetsistemas/brazilian_forgery
But definitely have a multilingual support is a better idea.


Add sprinkler-rain-grass model to probabilistic

@mm0821 Sorry for not merging right-away! Is this still up-to-date?

That's my fault. I marked it as draft, since I wanted to check whether I could simplify some comments (they are quite verbose in parts) or maybe even convert this into a case study. But I never found the time. It's quite old and I have to recheck whether it still works with the current version of Effekt.

This should work with the current Effekt version now. I guess the check here failed because the new syntax for block parameters is not yet supported on this branch (as it is quite a bit behind :smile:).
You can merge it, if you like. I don't know when I will have time to revise it and I fear will forget about it again...

Now that there are great case studies for probabilistic programming in Effekt, it is probably not necessary to turn this into a case study (I will likely forget about it anyway). Thus, you can just merge it, in case you want to keep it as a somewhat more elaborated example for testing, or otherwise just close the PR.

I think it is value to keep this. I rebased and updated the comment syntax.


objects method bug

Introduced bug in .objects method. Wasn't transforming the hash from session storage correctly. Didn't catch this earlier because crystal will not execute code paths if they're not being exercised. I blame a lack of tests. Introduced a few more tests for storable object.
/cc @sdogruyol

Nice catch 🔥


Rounding Problem on toInt()

The toInt() function rounds everything down. So for example a value of 4.8 will appear as 4 instead of 5.
Steps to reproduce:
List the minimal actions needed to reproduce the behavior.

Simply use the toInt() in a query

Expected behavior:
I expect floating point numbers with more than 0.5 in the decimal point to be rounded up and others with less than that to be rounded down.
Actual behavior:
All results are rounded down.
Environment info:

System info: Linux 5.9.16-1-MANJARO x86_64
InfluxDB version:Version 2.0.5 ('7c3ead)
Other relevant environment details: Container runtime, disk info, etc

Config:
Copy any non-default config values here or attach the full config as a gist or file.

Logs:
Include snippet of errors in log.
Performance:
Generate profiles with the following commands for bugs related to performance, locking, out of memory (OOM), etc.
# Commands should be run when the bug is actively happening.
# Note: This command will run for ~30 seconds.
curl -o profiles.tar.gz "http://localhost:8086/debug/pprof/all?cpu=30s"
iostat -xd 1 30 > iostat.txt
# Attach the `profiles.tar.gz` and `iostat.txt` output files.

@GregImproveIO toInt() and int() don’t round float values; they truncate them to the decimal point. To round numbers, you can use math.round() before converting values to integers.

I’ll update the documentation to explain this behavior.

I have a similar problem. I can't convert boolen to a number. Here is my example:
from(bucket: "iobroker/global")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_field"] == "value")
  |> filter(fn: (r) => r["_measurement"] == "esphome.0.84F3EBAF8F7F.info._online")
  |> toInt()
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> yield(name: "last")

for some reason, I get the values at the output
0.4166666666666667
0.5
0.4827586206896552
0.4583333333333333
1
0
why is this happening, and how to make it return only 1 or 0 ?

@Anzic23 did you get to the bottom of this?  I believe that your source data contains non booleans...  to debug this you would want to essentially comment out the last three rows of your query to see what is being returned from the top portion.


Set up Mypy

Let's start with:

common/ast
edgeql/compiler

The majority of typing errors in the compiler have been fixed in e7b95b8a233 and cac8d93fb213.   Next big areas to clean up are the ir and schema packages.

I'm closing this one. We'll open new typing issues as we go.


Pom is malformed on maven central.

Just tried to compile, gave me this error.
[WARNING] The POM for com.google.actions:actions-on-google:pom:1.0.0 is invalid, transitive dependencies (if any) will not be available:
 2 problems were encountered while building the effective model for com.google.actions:actions-on-google:1.0.0
[ERROR] 'dependencies.dependency.systemPath' for com.google.actions.v2:google-actions-bindings:jar must specify an absolute path but
is ${project.basedir}/lib/libactions_java_lib.jar @
[ERROR] 'dependencies.dependency.systemPath' for com.dialogflow.bindings:dialogflow-bindings:jar must specify an absolute path but
is ${project.basedir}/lib/libdialogflow_java_lib.jar @

Where would one be looking for these dependencies:
<dependency>
      <groupId>com.google.actions</groupId>
      <artifactId>actions-bindings</artifactId>
      <version>2.0.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.google.actions</groupId>
      <artifactId>dialogflow-bindings</artifactId>
      <version>2.0.0</version>
      <scope>provided</scope>
    </dependency>

They don't seem to be available on search.maven.org and instead went to sonatype repo as pointed here: https://stackoverflow.com/questions/54585915/which-jar-houses-com-google-api-services-actions-fulfillment-v2-model-packag.  Why the inconsistency?

Those two files should originate as jar files that are embedded in the library source, and aren't hosted directly on Maven.


java-microprofile: remove quickstart security password

Checklist:

[x] Read the Code of Conduct and Contributing Guidelines.

[x] Followed the commit message guidelines.

[x] Stack adheres to Appsody stack structure.

Modifying an existing stack:

[x] Updated the stack version in stack.yaml

Remove quick start security password and default to auto-generated password.

More detail in matching PR:  https://github.com/kabanero-io/collections/pull/267


Automatic PR from RestAPI-PR653

Generated from RestAPI PR: https://github.com/Azure/azure-rest-api-specs/pull/653

Coverage decreased (-0.002%) to 56.18% when pulling d0c4a19988eca1bd4278040eab52ce8941aa13f7 on AutorestCI:RestAPI-PR653 into 126c0eab74406bc5e6c30f9054587fa5f0a26bb0 on Azure:dev.

Coverage decreased (-0.002%) to 56.18% when pulling d0c4a19988eca1bd4278040eab52ce8941aa13f7 on AutorestCI:RestAPI-PR653 into 126c0eab74406bc5e6c30f9054587fa5f0a26bb0 on Azure:dev.

Coverage decreased (-0.002%) to 56.18% when pulling d0c4a19988eca1bd4278040eab52ce8941aa13f7 on AutorestCI:RestAPI-PR653 into 126c0eab74406bc5e6c30f9054587fa5f0a26bb0 on Azure:dev.


A0-2097: refactor SessionBoundaries

Description
After this PR;

HashNum only be created with N = BlockNumber
SessionBoundaries no longer is generic over B: Block
SessionBoundaries is created using SessionBoundaryInfo as suggested in https://github.com/Cardinal-Cryptography/aleph-node/pull/1000#discussion_r1133938346

Next steps for the refactor will be:

AuthorityProvider not generic over N and FinalityNotificator not generic over B in result SessionMapUpdater does not need to be generic over B
RequestBlocks not generic over B. Could be generic over H: Hash
other changes, for example somehow unifying HashNum with BlockIdentifier in sync

Type of change

Refactor

I kinda dont like that we need to specify everywhere B::Header: HeaderT<Number = BlockNumber> where B: BlockT is specified but that's just me.

Yeaaah I also do not like it :/ Not sure other solutions would be good though. We  could:

Use unstable feature for associated type bounds
Use our own trait: trait OurBlock : Block<Header = Self::H> {   type H: Header<Number = BlockNumber>; }

Also if we added BlockIdentifier trait to more places in code, in some places we would not need to specify Header. Only in places where we directly operate on client. I think this is the direction we want to take in future.


Check if multiple objects are equal

Thanks @tugsanunlu 👍 . Here it is https://1loc.dev/#check-if-multiple-objects-are-equal


Migration Name Ignored

I would like to bring down a single migration by name, but when I try to run a down migration by name the name appears to be ignored.
$ db-migrate down "/20161010235332-change-userID-to-unsigned" --migrations-dir ./api/db/migration --config ./api/db/migration/database.json --verbose
[INFO] Detected and using the projects local version of db-migrate. '/home/avejidah/programming/cea-exam/node_modules/db-migrate/index.js'
[INFO] Using dev settings: { driver: 'mysql',
  user: '[REDACTED],
  password: '******',
  database: [REDACTED],
  multipleStatements: true }
[INFO] require: db-migrate-mysql
[INFO] connecting
[INFO] connected
[INFO] creating table: migrations
[SQL] CREATE TABLE IF NOT EXISTS `migrations` (`id` INTEGER  PRIMARY KEY AUTO_INCREMENT NOT NULL, `name` VARCHAR (255) NOT NULL, `run_on` DATETIME  NOT NULL)
[INFO] loading migrations from database
[SQL] SELECT * FROM `migrations` ORDER BY run_on DESC, name DESC
[INFO] preparing to run down migration:<PHONE_NUMBER>4119-update-numberOfQuestions-in-objectives
[SQL] SET AUTOCOMMIT=0;
[SQL] START TRANSACTION;
[ERROR] Error: Cannot find module '/home/avejidah/programming/cea-exam/api/db/migration/20161015004119-update-numberOfQuestions-in-objectives'
    at Function.Module._resolveFilename (module.js:455:15)
    at Function.Module._load (module.js:403:25)
    at Module.require (module.js:483:17)
    at require (internal/module.js:20:19)
    at Class.setup (/home/avejidah/programming/cea-exam/node_modules/db-migrate/lib/skeleton.js:157:12)
    at /home/avejidah/programming/cea-exam/node_modules/db-migrate/lib/migrator.js:220:33
    at tryCatcher (/home/avejidah/programming/cea-exam/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/home/avejidah/programming/cea-exam/node_modules/bluebird/js/release/promise.js:510:31)
    at Promise._settlePromise (/home/avejidah/programming/cea-exam/node_modules/bluebird/js/release/promise.js:567:18)
    at Promise._settlePromise0 (/home/avejidah/programming/cea-exam/node_modules/bluebird/js/release/promise.js:612:10)
    at Promise._settlePromises (/home/avejidah/programming/cea-exam/node_modules/bluebird/js/release/promise.js:691:18)
    at Async._drainQueue (/home/avejidah/programming/cea-exam/node_modules/bluebird/js/release/async.js:138:16)
    at Async._drainQueues (/home/avejidah/programming/cea-exam/node_modules/bluebird/js/release/async.js:148:10)
    at Immediate.Async.drainQueues (/home/avejidah/programming/cea-exam/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:574:20)
    at tryOnImmediate (timers.js:554:5)

Node version 6.6.0
npm version 3.10.8
db-migrate-0.10.0-beta.20
db-migrate-mysql-1.1.9
Thank you!

@benbotto This is and won't be possible.
If you specify a name for a down migration, it will migrate down all migrations until it reaches the one you declared.
But your posted verbose run indicates also something different. It seems that you deleted the migration<PHONE_NUMBER>4119-update-numberOfQuestions-in-objectives before reversing the migration itself. If you do this, this runs into the error thrown in your verbose run. You need to clean up this row in the migrations by yourself now or restore the migration with that name.
Another thing is that you confuse something. If you enter a target to migrate down to, you define the destination, that means, the migration name (the date already is enough btw.) is not being down migrated as it is the destination. It is the same for up, but in the case of up the destination is being executed as this is how it is expected to work.
The expectation can be defined as of the following:
A specification of migration is expected to bring the database in the state of the specified migration.
Therefore a down migration must not execute the down routine of the destination, as this wouldn't equal the state specified anymore and an up migration must execute the up routine of the destination as otherwise it also wouldn't equal the state specified anymore.
So if you want to run down to a migration including the migration you want to have run down, you would need to specify the migration before. But I guess it would make sense to add a command line option to add some more comfort here :)
In your case please also check your migrations folder and table as there is something wrong as stated from the error thrown in your example.

Ah, I see. Thanks.  I missed this line in the documentation: "migrationName is ignored for down migrations."  I read the part specific to using a date in an up, and then the part that states "All of the down migrations work identically to the up migrations by substituting the word down for  up."  I incorrectly assumed that down could be used for a single migration, but what you've said above clears it up.
Regarding the missing migration, it's just in a feature branch.  The verbose output above came from a branch that does not yet have the<PHONE_NUMBER>4119-update-numberOfQuestions-in-objectives migration.
Thanks again.


affected/package: stdlib math

What version of Go are you using (go version)?
v1.19
Does this issue reproduce with the latest release?
Yes
What operating system and processor architecture are you using (go env)?
darwin / arm64
Also reproduces in the Go Playground
What did you do?
Did some simple floating point multiplication: https://go.dev/play/p/utCY6W7Sk9h
What did you expect to see?
(0.5 * 0.8) + 0.2 = 0.6
(0.5 * 0.8) + 0.3 = 0.7
(0.5 * 0.8) + 0.4 = 0.8
What did you see instead?
(0.5 * 0.8) + 0.2 = 0.6000000000000001
(0.5 * 0.8) + 0.3 = 0.7
(0.5 * 0.8) + 0.4 = 0.8

Hello @thomshutt,
This is working as expected. Please refer to this site https://floating-point-gui.de/ for more details on Floating-Point Arithmetic. There are some libraries like shopspring/decimal that you could use instead.

Thanks @alexballas, will close the issue


[Done] Improve compatibility with different versions of VSCode

Short description of what this resolves:
This PR simplifies finding the code configuration folders and uses the API to install/uninstall extensions.
Changes proposed in this pull request:

Find Code folder using the globalStoragePath and by traversing 3 directories up
Find Extensions folder by getting a random extension and traversing up 1 directory
Use VSCode API to install/uninstall extensions

Fixes: #668
How Has This Been Tested?

I have tested this PR with the OSS version, VSCodium portable, and the official version (on Manjaro), and with the official version on Windows.
Checklist:

[x] I have read the contribution guidelines.

Progress:

[x] Install extensions using API
[x] Uninstall extensions using API
[x] Get folders properly

VSCodium user here, can you provide some instructions so I can test this? I'm pretty new to the VSC ecosystem, so if you could provide a prebuilt version of the extension and how to install it would be great. Thanks!

@roobre Here is a prebuilt version of this PR: https://cdn.discordapp.com/attachments/549007146868539408/572557047439032330/code-settings-sync-3.2.9.vsix

can you provide some instructions so I can test this?

Instructions can be found here on how to install the VSIX file: https://code.visualstudio.com/docs/editor/extension-gallery#_install-from-a-vsix

Done, but it's still not working for me on VSCodium. The upload is just fine, but after entering the token and gist id on the other side, and clicking Yes in the extension install prompt, nothing happens. Where can I can find a detailed log of why is it failing? Maybe that would be helpful.

@roobre are you getting anything in the console? You can find it under Help -> Toggle Developer Tools.

So, strangely, I tried to reproduce everything with the console open and now it is working (extensions are correctly installed). Thanks!
However, whenever I try to update the changes on the receiving side, a new gist is created instead of updating the one that was used to sync in the same place. This does not happen on the VSC instance that first updated the settings.

@roobre Here is an updated version with extension installation hopefully fixed. If you could test it, that would be great! https://cdn.discordapp.com/attachments/549007146868539408/574018699460345866/code-settings-sync-3.2.9.vsix

Should I test the current link or wait for a more recent version with the new commits applied? Thanks!

@roobre Here is an updated version with some issues with extension installation hopefully fixed. If you could test it, that would be great!
https://cdn.discordapp.com/attachments/549007146868539408/574452219064352768/code-settings-sync-3.2.9.vsix
Edit: updated with many many fixes

I think it's okay now. Thanks.

@roobre sorry for the late reply. Can you try this version? Installing extensions should work, but uninstallation has yet to be implemented. Thanks! https://cdn.discordapp.com/attachments/549007146868539408/576214978931982336/code-settings-sync-3.2.9.vsix

@arnohovhannisyan I have done a simple test and seems to be working good so far in VSCodium.
Made an initial upload on host A, downloaded to host B, made changes on host B, and gitst seems to be updated accordingly.
Tomorrow I'll test to see if downloading changes on host A again works properly, but for now it seems quite nice.
Thanks!

@shanalikhan Microsoft has released the May 2019 update, so this PR is complete and ready to be merged.

@shanalikhan Are you happy with my changes? Do you have any other requests for changes?

Thanks. Merged.
You can test on v3.3.0.
I will test it also alongwith other PR and release upcoming version soon.

Okay this is some initial observation.

Got this error while it tried to remove.

This is in the Output Pane. If you observe the logs, it didnt wrote the added extensions in the output pane even after installing and didnt show anything on removed extensions.

Realtime Extension Download Summary
--------------------
TOTAL EXTENSIONS : 8

[x] - EXTENSION: rainbow-brackets INSTALLED.
      1 OF 8 INSTALLED

[x] - EXTENSION: path-intellisense INSTALLED.
      2 OF 8 INSTALLED

[x] - EXTENSION: npm-intellisense INSTALLED.
      3 OF 8 INSTALLED

[x] - EXTENSION: vscode-eslint INSTALLED.
      4 OF 8 INSTALLED

[x] - EXTENSION: vscodeintellicode INSTALLED.
      5 OF 8 INSTALLED

[x] - EXTENSION: shades-of-purple INSTALLED.
      6 OF 8 INSTALLED

[x] - EXTENSION: tslint INSTALLED.
      7 OF 8 INSTALLED

[x] - EXTENSION: jshint INSTALLED.
      8 OF 8 INSTALLED

CODE SETTINGS SYNC DOWNLOAD SUMMARY
Version: 3.2.9
--------------------
GitHub Token: xxxxx
GitHub Gist: e86911443d3f81be6a66699603aee6dc
GitHub Gist Type: Secret

Restarting Visual Studio Code may be required to apply color and file icon theme.
--------------------
Files Downloaded:
  extensions.json > extensions.json
  keybindings.json > keybindings.json
  launch.json > launch.json
  locale.json > locale.json
  settings.json > settings.json
  snippets|blade.json > snippets|blade.json
  snippets|c.json > snippets|c.json
  snippets|clojure.json > snippets|clojure.json
  snippets|csharp.json > snippets|csharp.json
  snippets|go.json > snippets|go.json
  snippets|html.json > snippets|html.json
  snippets|javascript.json > snippets|javascript.json
  snippets|javascriptreact.json > snippets|javascriptreact.json
  snippets|php.json > snippets|php.json
  snippets|sass.json > snippets|sass.json
  snippets|test.code-snippets > snippets|test.code-snippets
  vsicons.settings.json > vsicons.settings.json

Extensions Ignored:
  No extensions ignored.

Extensions Removed:

Please open new PR fixing this, linking with this PR and original issue.
:)

when do you think you can fix it?

@shanalikhan I'll look into it as soon as I can. I'm just a  bit busy at the moment.

@shanalikhan I can't reproduce this issue on my machine. I have set up a portable version of VSCode and am debugging the extension with it, and everything works. Both removed and added extensions show up correctly.

I can't reproduce this issue on my machine

Can you try to throw manually exception regarding "Unable to remove some extensions". and see what happens in that case. Meanwhile i will test again.

@shanalikhan Ok, I think I know what's causing some of these problems.
If an error occurs during the deletion process, deletedExtensions is set to an error that is caught by the try-catch. That error doesn't have a forEach method, so an exception is thrown which prevents the added extensions from being printed.
Can you test this version? It should throw the error so we can find out what's causing the deletion to fail.
https://cdn.discordapp.com/attachments/549007146868539408/587603441908580362/code-settings-sync-3.2.9.vsix

If an error occurs during the deletion process, deletedExtensions is set to an error that is caught by the try-catch. That error doesn't have a forEach method, so an exception is thrown which prevents the added extensions from being printed.

Exactly.
i will try on home computer where it was not working properly and let you know.

Before testing that one, another thing observed.
Please test this line of code on multiple times.
Missing Extension List is incorrect.
See the image

@shanalikhan My new PR (#907) should fix both of these issues. I have tested them and they work just as expected.

So, now 3.3.1 is officially released and published, it should work. : )

@tunnckoCore Yes Settings Sync supports all OSS versions now.
Let us know if you find any problem.


Change options for translating text

Can we change the "from" and "to" option on runtime?
<RnCamera
style={styles.camera}
device={device}
isActive
options={{
from: fromLanguageValue,
to: toLanguageValue,
}}
mode={'translate'}
callback={d => setData(d)}
/>

I am trying to change the from language and to language from a dropdown but camera is not picking the new updated language. No matter which language I select, it always translate to german (which is the default one if no options are being passed to camera)
https://github.com/user-attachments/assets/e431c4e9-b796-417f-9fe8-a23e57990289

+1

@HamzaReza Hi, becouse language you can pass only on init Camera, pass it in runtime it can slow down performance. If you want do it runtime I can create package like you want.

@HamzaReza Hi, becouse language you can pass only on init Camera, pass it in runtime it can slow down performance. If you want do it runtime I can create package like you want.

If it is possible for you to do it, I would be thankful.

You can write about that, to my gmail<EMAIL_ADDRESS>


Fix 8549: Using variable as Jsx tagname

Fix #8549

Test tsxUnionTypeComponent2 should probably be changed to use a number rather than a string to preserve the test's original intent.

:+1: overall, just a few comments


Add kube client oidc authentication support for testing

Changes
Currently, the test client in Tekton test doesn't support Kubernetes cluster with oidc authentication.
I tried to run e2e test for my Tekton build, and I found the test can only use the kubeconfig which in ~/.kube/config, and my kube cluster use oidc for auth but the current Tekton client doesn't support that.
I take a look the knative serving and eventing, their clients have the config for oidc:
https://github.com/knative/serving/blob/78995f561c50acb87c9f5d386e07dbb3c597aeeb/test/clients.go#L25
But tekton test client doesn't have that:
https://github.com/tektoncd/pipeline/blob/master/test/clients.go
Without this oidc package,all tests will fail like:
--- FAIL: TestEventListenerCreate (0.00s)
    eventlistener_test.go:48: Failed to create kubernetes clientset from config file at /home/travis/.kube/config: No Auth Provider found for name "oidc"

So I follow what knative repo did in this PR:
1, Use dep to add oidc package:
dep ensure -add k8s.io/client-go/plugin/pkg/client/auth/oidc
2, Add import in test/init_test.go
Submitter Checklist
These are the criteria that every PR should meet, please check them off as you
review them:

[ ] Includes tests (if functionality changed/added)
[ ] Includes docs (if user facing)
[x] Commit messages follow commit message best practices

/ok-to-test

/ok-to-test

@zhangtbj you should rebase against master instead of merging :angel: as this creates a merge commit that we don't really want :stuck_out_tongue_closed_eyes:
/hold

Sorry about that. @vdemeester .
So let me merge them as one commit?

@zhangtbj yep, if you can squash those 2 commits to give one clean commit, it will be :+1:

Hi @vdemeester ,
I close this PR and opened a new PR:
https://github.com/tektoncd/pipeline/pull/1577


Question about custom layer tags

Hi, I have the following code where I define a model inside of a templated struct, so that I can change the bn_con layer with affine layers and also have a parametric activation layer.
I have been using this approach for a while and it worked perfectly, until I define custom tag layers:
#include <dlib/dnn.h>

namespace model
{
    using namespace dlib;

    template <template <typename> class ACT, template <typename> class BN>
    struct def
    {
        template <typename SUBNET> using ctag1 = add_tag_layer<3001, SUBNET>;
        using net_type = loss_multiclass_log_per_pixel<
        add_prev<ctag1, ACT<BN<con<16, 3, 3, 1, 1,
        ctag1<ACT<BN<con<16, 3, 3, 1, 1,
        input_rgb_image>>>>>>>>>;
    };
    using train = def<relu, bn_con>::net_type;
    using infer = def<relu, affine>::net_type;
}

auto main() -> int
{
    model::train net;
    model::infer net2(net);  // <-- this line does not compile.
}

I get a compilation error when assigning the network with bn_layer to the network with affine layer (assigning to the same type works):
ninja: Entering directory `build'
[1/2] Building CXX object CMakeFiles/custom_tag.dir/custom_tag.cpp.o
FAILED: CMakeFiles/custom_tag.dir/custom_tag.cpp.o
/usr/bin/c++  -I/home/adria/Projects/dlib/dlib/.. -O3 -DNDEBUG -DDLIB_JPEG_SUPPORT -DDLIB_USE_BLAS -DDLIB_USE_LAPACK -DDLIB_USE_CUDA -DDLIB_PNG_SUPPORT -DDLIB_GIF_SUPPORT -Wreturn-type -MD -MT CMakeFiles/custom_tag.dir/custom_tag.cpp.o -MF CMakeFiles/custom_tag.dir/custom_tag.cpp.o.d -o CMakeFiles/custom_tag.dir/custom_tag.cpp.o -c ../custom_tag.cpp
In file included from /home/adria/Projects/dlib/dlib/../dlib/dnn/layers.h:8,
                 from /home/adria/Projects/dlib/dlib/../dlib/dnn.h:23,
                 from ../custom_tag.cpp:1:
/home/adria/Projects/dlib/dlib/../dlib/dnn/core.h: In instantiation of ‘dlib::add_layer<LAYER_DETAILS, SUBNET, typename std::enable_if<dlib::is_nonloss_layer_type<SUBNET>::value>::type>::add_layer(const dlib::add_layer<T, U, E>&) [with T = dlib::add_prev_<model::def<dlib::relu, dlib::bn_con>::ctag1>; U = dlib::add_layer<dlib::relu_, dlib::add_layer<dlib::bn_<dlib::CONV_MODE>, dlib::add_layer<dlib::con_<16, 3, 3, 1, 1, 1, 1>, dlib::add_tag_layer<3001, dlib::add_layer<dlib::relu_, dlib::add_layer<dlib::bn_<dlib::CONV_MODE>, dlib::add_layer<dlib::con_<16, 3, 3, 1, 1, 1, 1>, dlib::input_rgb_image, void>, void>, void>, void>, void>, void>, void>; E = void; LAYER_DETAILS = dlib::add_prev_<model::def<dlib::relu, dlib::affine>::ctag1>; SUBNET = dlib::add_layer<dlib::relu_, dlib::add_layer<dlib::affine_, dlib::add_layer<dlib::con_<16, 3, 3, 1, 1, 1, 1>, dlib::add_tag_layer<3001, dlib::add_layer<dlib::relu_, dlib::add_layer<dlib::affine_, dlib::add_layer<dlib::con_<16, 3, 3, 1, 1, 1, 1>, dlib::input_rgb_image, void>, void>, void>, void>, void>, void>, void>; typename std::enable_if<dlib::is_nonloss_layer_type<SUBNET>::value>::type = void]’:
/home/adria/Projects/dlib/dlib/../dlib/dnn/core.h:2369:37:   required from ‘dlib::add_loss_layer<LOSS_DETAILS, SUBNET>::add_loss_layer(const dlib::add_loss_layer<T, U>&) [with T = dlib::loss_multiclass_log_per_pixel_; U = dlib::add_layer<dlib::add_prev_<model::def<dlib::relu, dlib::bn_con>::ctag1>, dlib::add_layer<dlib::relu_, dlib::add_layer<dlib::bn_<dlib::CONV_MODE>, dlib::add_layer<dlib::con_<16, 3, 3, 1, 1, 1, 1>, dlib::add_tag_layer<3001, dlib::add_layer<dlib::relu_, dlib::add_layer<dlib::bn_<dlib::CONV_MODE>, dlib::add_layer<dlib::con_<16, 3, 3, 1, 1, 1, 1>, dlib::input_rgb_image, void>, void>, void>, void>, void>, void>, void>, void>; LOSS_DETAILS = dlib::loss_multiclass_log_per_pixel_; SUBNET = dlib::add_layer<dlib::add_prev_<model::def<dlib::relu, dlib::affine>::ctag1>, dlib::add_layer<dlib::relu_, dlib::add_layer<dlib::affine_, dlib::add_layer<dlib::con_<16, 3, 3, 1, 1, 1, 1>, dlib::add_tag_layer<3001, dlib::add_layer<dlib::relu_, dlib::add_layer<dlib::affine_, dlib::add_layer<dlib::con_<16, 3, 3, 1, 1, 1, 1>, dlib::input_rgb_image, void>, void>, void>, void>, void>, void>, void>, void>]’
../custom_tag.cpp:24:26:   required from here
/home/adria/Projects/dlib/dlib/../dlib/dnn/core.h:795:45: error: no matching function for call to ‘dlib::add_prev_<model::def<dlib::relu, dlib::affine>::ctag1>::add_prev_(const layer_details_type&)’
  795 |             cached_output(item.cached_output)
      |                                             ^
In file included from /home/adria/Projects/dlib/dlib/../dlib/dnn.h:23,
                 from ../custom_tag.cpp:1:
/home/adria/Projects/dlib/dlib/../dlib/dnn/layers.h:2310:9: note: candidate: ‘dlib::add_prev_<tag>::add_prev_() [with tag = model::def<dlib::relu, dlib::affine>::ctag1]’
 2310 |         add_prev_()
      |         ^~~~~~~~~
/home/adria/Projects/dlib/dlib/../dlib/dnn/layers.h:2310:9: note:   candidate expects 0 arguments, 1 provided
/home/adria/Projects/dlib/dlib/../dlib/dnn/layers.h:2305:11: note: candidate: ‘dlib::add_prev_<model::def<dlib::relu, dlib::affine>::ctag1>::add_prev_(const dlib::add_prev_<model::def<dlib::relu, dlib::affine>::ctag1>&)’
 2305 |     class add_prev_
      |           ^~~~~~~~~
/home/adria/Projects/dlib/dlib/../dlib/dnn/layers.h:2305:11: note:   no known conversion for argument 1 from ‘const layer_details_type’ {aka ‘const dlib::add_prev_<model::def<dlib::relu, dlib::bn_con>::ctag1>’} to ‘const dlib::add_prev_<model::def<dlib::relu, dlib::affine>::ctag1>&’
/home/adria/Projects/dlib/dlib/../dlib/dnn/layers.h:2305:11: note: candidate: ‘dlib::add_prev_<model::def<dlib::relu, dlib::affine>::ctag1>::add_prev_(dlib::add_prev_<model::def<dlib::relu, dlib::affine>::ctag1>&&)’
/home/adria/Projects/dlib/dlib/../dlib/dnn/layers.h:2305:11: note:   no known conversion for argument 1 from ‘const layer_details_type’ {aka ‘const dlib::add_prev_<model::def<dlib::relu, dlib::bn_con>::ctag1>’} to ‘dlib::add_prev_<model::def<dlib::relu, dlib::affine>::ctag1>&&’
ninja: build stopped: subcommand failed.

From what I see, it can't find the conversion from:

dlib::add_prev_<model::def<dlib::relu, dlib::bn_con>::ctag1 to dlib::add_prev_<model::def<dlib::relu, dlib::affine>::ctag1

However, if I move the custom tag just above the templated struct, everything works... To me, it seems like an odd behavior. If there's no other way, I will define the custom tags outside.

It's because those ctag1 references are different templates.  Like consider this:
    if (std::is_same<foo<def<relu, affine>::ctag1>, foo<def<relu, bn_con>::ctag1>>::value)
        std::cout << "same" << std::endl;
    else
        std::cout << "not same" << std::endl;

That prints not same, which is admittedly a funny quirk of C++.  You would think that since ctag1 isn't actually dependent on the template arguments of def that they therefore wouldn't matter, but they do.

Oh, I see. thank you for the explanation. I somehow got confused by the fact that one can construct affine_ layers with bn_ layers, but indeed, when the tags are declared inside of a struct, they become different types.
I will put them outside of the struct, then, thank you :)


[Question] Spatial buffers?

We've noticed that when using odc-stac with e.g.
query = stac_client.search(collections=["sentinel-2-l2a"],
                           bbox=wgs_bbox, datetime=[start_time, end_time],
                           limit=20)
items = query.item_collection()
stack = stac_load(items, bands=bands,
                  resolution=resolution, crs=f"EPSG:{epsg}", groupby="solar_day",
                  bbox=wgs_bbox, chunks={"x": -1, "y": -1}, stac_cfg=STAC_CFG,
                  fail_on_error=fail_on_errors)

We end up getting a slightly larger bounding box then the original bounding box (after converting from WGS to the desired CRS).
I wonder if this is intentional, and/or if there are explicit buffers in how STAC works? Or is it simply due to inaccuracies in WGS84 vs local projection?
When we later stitch several geotiffs together, this is not a particular concern, since the pixels overlap anyway and their values are identical. But when we ingest this data to an indexed database, we end up with duplicate errors that need to be handled 🤔

@idantene
this is as expected. But we still don't have a proper docs page that explains pixel grids to which to link to, for new see #95.
See anchor parameter of stac_load.

Also, may I suggest pinning #95 and #54? :)

@idantene

I'm not sure I follow how to use the anchor argument though. Should I use the AnchorEnum and turn grid snapping off completely, or use the geobox argument to specify the desired extents?

Specifying geobox= parameter is the most direct and precise way to control output. If you know bounding box and resolution you want you can  just supply geobox=GeoBox.from_bbox(bbox, resolution=gsd, tight=True).
See GeoBox.from_bbox

What would be the difference between the two behaviours, given that our bbox is a multiple of resolution in the target crs?

Imagine axis aligned grid with spacing equal to the ground sampling distance, this grid is "anchored" tox=0 and y=0 (grid includes those two lines). Grid lines are pixel edges. This is the grid we "snap to" by default, that way all the image data loaded at the same resolution will have exactly overlapping pixels so you can just "paste" pixels from one array to another. When supplying anchor=AnchorEnum.FLOATING or tight=True this snapping is turned off, but you might still get an extra pixel on the right bottom, depending on floating point precision and resolution, you can control for that with tol= parameter of GeoBox.from_bbox, but we don't bubble up all those settings to odc.stac.load.
The main difference with supplying anchor= vs geobox= is that with anchor= you can have automatic decisions about resolution and CRS be made by odc-stac, while with geobox= you have to set those in your own code.


top line comment

A recommendation to help ensure copyright & not getting lost in concocting.

Hey @tomByrer thx for the good tip :+1:

BTW, convention is the info comment goes on top.  Imagine getting this file without the URL (like how CloudFlare mangles filenames of JS).  How will users find where your code starts?
http://cdn.jsdelivr.net/g/abaaso,ace,wave.io,alloyui