enable IPv6 support in K8s and for Akash deployments #IPv6DualStack #PoC

ToDo to support IPv6

[ ] IPv6 in K8s: docs(kubespray): Write the doc how-to enable the IPv6 in the Kubernetes cluster using kubespray
[ ] Ingress: service(deployment): provider should set ipFamilyPolicy: PreferDualStack and add IPv4 & IPv6 ipFamilies to the service of the deployment;
[ ] Egress: netpol(akash-deployment-restrictions): provider should add ::/0 (IPv6 CIDR ipBlock) to the egress of the deployment's netpol;
[ ] ingress-nginx: nginx ingress should be set to support the IPv6;
[x] metallb: test whether MetalLB supports IPv6 and then Provider will need to support it as well (this can be done as a separate ticket);

I've ran the nym-mixnode as PoC

https://twitter.com/andy83482/status/1665093815290437635
IPv6 https://twitter.com/andy83482/status/1665348733796511747
SDL https://gist.github.com/andy108369/ef23ff0fe5caf2e12b1b41a99e812294

Here is how I've enabled the IPv6 on my provider:

Enable IPv6DualStack on your Akash provider
I've just enabled the IPv6 on my Akash provider (provider.akash.pro) and it works.
However, with the manual netpol change required to allow the IPv6 Egress, and also Service kind of resource needs to be updated to accept the Ingress over IPv6. See below.
To enable it one needs to do the following:

Ensure host supports IPv6

# ls -la /proc/net/if_inet6
-r--r--r-- 1 root root 0 Jun  4 06:03 /proc/net/if_inet6

# sysctl net.ipv6.conf.all.disable_ipv6 net.ipv6.conf.default.disable_ipv6 net.ipv6.conf.lo.disable_ipv6 net.ipv6.conf.all.forwarding net.ipv6.conf.default.forwarding
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.forwarding = 1

Update the netplan config to enable IPv6

2a01:4f9:6a:55d0::/64 -- from Hetzner I am using

add to the netplan config:
# cat /etc/netplan/01.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true
      dhcp4-overrides:
        use-domains: false
      # disable accept-ra, otherwise it will bring search domains to your /etc/resolv.conf
      # refs [https://bugs.launchpad.net/netplan/+bug/1858503](https://bugs.launchpad.net/netplan/+bug/1858503)
      accept-ra: false
      dhcp6: false
      addresses:
        - 2a01:4f9:6a:55d0::/64
      gateway6: fe80::1
      routes:
      - to: ::/0
        via: fe80::1
        on-link: true

Add enable_dual_stack_networks: true to kubespray/inventory/akash/group_vars/k8s_cluster/k8s-cluster.yml

Add nat_outgoing_ipv6: true to inventory/akash/group_vars/k8s_cluster/k8s-net-calico.yml

Kubespray the cluster

Apply facts.yml, upgrade-cluster.yml and cluster.yml playbooks in this order.

New deployments (or the ones which had their manifest updated) will get the ipv6 address.
However, this requires updating the netpol egress to support the ::/0 IPV6 CIDR for them to access the Egress, e.g.
kubectl -n $ns patch netpol akash-deployment-restrictions --type='json' -p='[{"op": "add", "path": "/spec/egress/-", "value": {"to": [{"ipBlock": {"cidr": "::/0"}}]}}]'

NOTE: You gonna have to kubectl patch netpol akash-deployment-restrictions again if akash-provider pod restarts.

To accept the Ingress over IPv6 the service needs to be patched as follows:
kubectl patch svc mixnode-np -n $ns --type='json' -p='[
  {"op": "replace", "path": "/spec/ipFamilyPolicy", "value": "PreferDualStack"},
  {"op": "replace", "path": "/spec/ipFamilies", "value": ["IPv4", "IPv6"]}
]'

Tests and verifications
Test IPv6: Egress
root@node1:~# kubectl run  -it --rm  wget --image=cirrusci/wget -- sh
If you don't see a command prompt, try pressing enter.
/ # wget -6 google.com
--2023-06-04 13:36:04--  http://google.com/
Resolving google.com... 2a00:1450:400f:80a::200e
Connecting to google.com|2a00:1450:400f:80a::200e|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://www.google.com/ [following]
--2023-06-04 13:36:04--  http://www.google.com/
Resolving www.google.com... 2a00:1450:400f:801::2004
Connecting to www.google.com|2a00:1450:400f:801::2004|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: 'index.html'

index.html                                 [ <=>                                                                      ]  16.73K  --.-KB/s    in 0.006s

2023-06-04 13:36:04 (2.86 MB/s) - 'index.html' saved [17136]

Test IPv6: Ingress

via NodePort

root@node1:~# cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30080
  type: NodePort
  ipFamilyPolicy: PreferDualStack
  ipFamilies:
    - IPv4
    - IPv6

Now try accessing the 30080/tcp over IPv6 address of your node.
Additional verification
root@node1:~# calicoctl get node -o wide
NAME    ASN       IPV4              IPV6
node1   (64512)   <IP_ADDRESS>/26   2a01:4f9:6a:55d0::/64

root@node1:~# calicoctl ipam show
+----------+------------------------------+-----------+------------+--------------+
| GROUPING |             CIDR             | IPS TOTAL | IPS IN USE |   IPS FREE   |
+----------+------------------------------+-----------+------------+--------------+
| IP Pool  | <IP_ADDRESS>/18               |     16384 | 32 (0%)    | 16352 (100%) |
| IP Pool  | fd85:ee78:d8a6:8607::1:0/112 |     65536 | 30 (0%)    | 65506 (100%) |
+----------+------------------------------+-----------+------------+--------------+

root@node1:~# calicoctl ipam show --show-blocks --allow-version-mismatch
+----------+---------------------------------+-----------+------------+--------------+
| GROUPING |              CIDR               | IPS TOTAL | IPS IN USE |   IPS FREE   |
+----------+---------------------------------+-----------+------------+--------------+
| IP Pool  | <IP_ADDRESS>/18                  |     16384 | 32 (0%)    | 16352 (100%) |
| Block    | <IP_ADDRESS>/24                  |       256 | 32 (12%)   | 224 (88%)    |
| IP Pool  | fd85:ee78:d8a6:8607::1:0/112    |     65536 | 30 (0%)    | 65506 (100%) |
| Block    | fd85:ee78:d8a6:8607::1:a680/122 |        64 | 30 (47%)   | 34 (53%)     |
+----------+---------------------------------+-----------+------------+--------------+

root@node1:~# calicoctl ipam check
Checking IPAM for inconsistencies...

Loading all IPAM blocks...
Found 2 IPAM blocks.
 IPAM block <IP_ADDRESS>/24 affinity=host:node1:
 IPAM block fd85:ee78:d8a6:8607::1:a680/122 affinity=host:node1:
IPAM blocks record 62 allocations.

Loading all IPAM pools...
  <IP_ADDRESS>/18
  fd85:ee78:d8a6:8607::1:0/112
Found 2 active IP pools.

Loading all nodes.
Found 1 node tunnel IPs.

Loading all workload endpoints.
Found 61 workload IPs.
Workloads and nodes are using 62 IPs.

Loading all handles
Looking for top (up to 20) nodes by allocations...
  node1 has 62 allocations
Node with most allocations has 62; median is 62

Scanning for IPs that are allocated but not actually in use...
Found 0 IPs that are allocated in IPAM but not actually in use.
Scanning for IPs that are in use by a workload or node but not allocated in IPAM...
Found 0 in-use IPs that are not in active IP pools.
Found 0 in-use IPs that are in active IP pools but have no corresponding IPAM allocation.

Scanning for IPAM handles with no matching IPs...
Found 0 handles with no matching IPs (and 32 handles with matches).
Scanning for IPs with missing handle...
Found 0 handles mentioned in blocks with no matching handle resource.
Check complete; found 0 problems.

make sure natOutgoing: true for both default-pool and default-pool-ipv6 IP pools

root@node1:~# calicoctl get ippools -o yaml
apiVersion: projectcalico.org/v3
items:
- apiVersion: projectcalico.org/v3
  kind: IPPool
  metadata:
    creationTimestamp: "2022-05-06T12:48:29Z"
    name: default-pool
    resourceVersion: "78112182"
    uid: bfe9ee79-1852-4e71-a8e1-901b47dac81b
  spec:
    allowedUses:
    - Workload
    - Tunnel
    blockSize: 24
    cidr: <IP_ADDRESS>/18
    ipipMode: Never
    natOutgoing: true
    nodeSelector: all()
    vxlanMode: Always
- apiVersion: projectcalico.org/v3
  kind: IPPool
  metadata:
    creationTimestamp: "2023-06-04T06:04:06Z"
    name: default-pool-ipv6
    resourceVersion: "78125668"
    uid: 73e4db15-f8fa-405a-84e5-d5b345c0c524
  spec:
    allowedUses:
    - Workload
    - Tunnel
    blockSize: 122
    cidr: fd85:ee78:d8a6:8607::1:0/112
    ipipMode: Never
    natOutgoing: true
    nodeSelector: all()
    vxlanMode: Never
kind: IPPoolList
metadata:
  resourceVersion: "78168505"

and some more snaps
# kubectl -n kube-system get daemonset calico-node -o yaml | grep -E -w -A1 'IP|IP_AUTODETECTION_METHOD|CALICO_IPV6POOL_CIDR|CALICO_ROUTER_ID|FELIX_IPV6SUPPORT|IP6|IP6_AUTODETECTION_METHOD|K8S_API_ENDPOINT'
        - name: FELIX_IPV6SUPPORT
          value: "True"
--
        - name: IP_AUTODETECTION_METHOD
          value: can-reach=$(NODEIP)
        - name: IP
          value: autodetect
        - name: IP6
          value: autodetect

root@node1:~# cat /etc/cni/net.d/10-calico.conflist
{
  "name": "k8s-pod-network",
  "cniVersion":"0.3.1",
  "plugins":[
    {
      "datastore_type": "kubernetes",
      "nodename": "node1",
      "type": "calico",
      "log_level": "info",
      "log_file_path": "/var/log/calico/cni/cni.log",
      "ipam": {
        "type": "calico-ipam",
        "assign_ipv6": "true",
        "ipv6_pools": ["fd85:ee78:d8a6:8607::1:0000/112"],
        "ipv4_pools": ["<IP_ADDRESS>/18"],
        "assign_ipv4": "true"
      },
      "policy": {
        "type": "k8s"
      },
      "kubernetes": {
        "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
      }
    },
    {
      "type":"portmap",
      "capabilities": {
        "portMappings": true
      }
    },
    {
      "type":"bandwidth",
      "capabilities": {
        "bandwidth": true
      }
    }
  ]
}

# kubectl -n kube-system get cm kubeadm-config -o yaml
apiVersion: v1
data:
  ClusterConfiguration: |
    apiServer:
      certSANs:
      - kubernetes
      - kubernetes.default
      - kubernetes.default.svc
      - kubernetes.default.svc.cluster.local
      - <IP_ADDRESS>
      - localhost
      - <IP_ADDRESS>
      - node1
      - lb-apiserver.kubernetes.local
      - <IP_ADDRESS>
      extraArgs:
        allow-privileged: "true"
        anonymous-auth: "True"
        apiserver-count: "1"
        authorization-mode: Node,RBAC
        bind-address: <IP_ADDRESS>
        default-not-ready-toleration-seconds: "300"
        default-unreachable-toleration-seconds: "300"
        enable-aggregator-routing: "False"
        endpoint-reconciler-type: lease
        event-ttl: 1h0m0s
        kubelet-preferred-address-types: InternalDNS,InternalIP,Hostname,ExternalDNS,ExternalIP
        profiling: "False"
        request-timeout: 1m0s
        service-account-lookup: "True"
        service-cluster-ip-range: <IP_ADDRESS>/18,fd85:ee78:d8a6:8607::1000/116
        service-node-port-range: 30000-32767
        storage-backend: etcd3
      extraVolumes:
      - hostPath: /usr/share/ca-certificates
        mountPath: /usr/share/ca-certificates
        name: usr-share-ca-certificates
        readOnly: true
      timeoutForControlPlane: 5m0s
    apiVersion: kubeadm.k8s.io/v1beta3
    certificatesDir: /etc/kubernetes/ssl
    clusterName: cluster.local
    controlPlaneEndpoint: <IP_ADDRESS>:6443
    controllerManager:
      extraArgs:
        bind-address: <IP_ADDRESS>
        cluster-cidr: <IP_ADDRESS>/18,fd85:ee78:d8a6:8607::1:0000/112
        configure-cloud-routes: "false"
        leader-elect-lease-duration: 15s
        leader-elect-renew-deadline: 10s
        node-cidr-mask-size-ipv4: "24"
        node-cidr-mask-size-ipv6: "120"
        node-monitor-grace-period: 40s
        node-monitor-period: 5s
        profiling: "False"
        service-cluster-ip-range: <IP_ADDRESS>/18,fd85:ee78:d8a6:8607::1000/116
        terminated-pod-gc-threshold: "12500"
    dns:
      imageRepository: registry.k8s.io/coredns
      imageTag: v1.9.3
    etcd:
      external:
        caFile: /etc/ssl/etcd/ssl/ca.pem
        certFile: /etc/ssl/etcd/ssl/node-node1.pem
        endpoints:
        - https://<IP_ADDRESS>:2379
        keyFile: /etc/ssl/etcd/ssl/node-node1-key.pem
    imageRepository: registry.k8s.io
    kind: ClusterConfiguration
    kubernetesVersion: v1.25.6
    networking:
      dnsDomain: cluster.local
      podSubnet: <IP_ADDRESS>/18,fd85:ee78:d8a6:8607::1:0000/112
      serviceSubnet: <IP_ADDRESS>/18,fd85:ee78:d8a6:8607::1000/116
    scheduler:
      extraArgs:
        bind-address: <IP_ADDRESS>
        config: /etc/kubernetes/kubescheduler-config.yaml
      extraVolumes:
      - hostPath: /etc/kubernetes/kubescheduler-config.yaml
        mountPath: /etc/kubernetes/kubescheduler-config.yaml
        name: kubescheduler-config
        readOnly: true
kind: ConfigMap
metadata:
  creationTimestamp: "2022-05-06T12:47:23Z"
  name: kubeadm-config
  namespace: kube-system
  resourceVersion: "78161076"
  uid: c43987c8-3499-419f-9024-088ed07781a6

# kubectl -n kube-system get cm kubelet-config -o yaml
apiVersion: v1
data:
  kubelet: |
    apiVersion: kubelet.config.k8s.io/v1beta1
    authentication:
      anonymous:
        enabled: false
      webhook:
        cacheTTL: 0s
        enabled: true
      x509:
        clientCAFile: /etc/kubernetes/ssl/ca.crt
    authorization:
      mode: Webhook
      webhook:
        cacheAuthorizedTTL: 0s
        cacheUnauthorizedTTL: 0s
    cgroupDriver: systemd
    clusterDNS:
    - <IP_ADDRESS>
    clusterDomain: cluster.local
    cpuManagerReconcilePeriod: 0s
    evictionPressureTransitionPeriod: 0s
    fileCheckFrequency: 0s
    healthzBindAddress: <IP_ADDRESS>
    healthzPort: 10248
    httpCheckFrequency: 0s
    imageMinimumGCAge: 0s
    kind: KubeletConfiguration
    logging:
      flushFrequency: 0
      options:
        json:
          infoBufferSize: "0"
      verbosity: 0
    memorySwap: {}
    nodeStatusReportFrequency: 0s
    nodeStatusUpdateFrequency: 0s
    resolvConf: /run/systemd/resolve/resolv.conf
    rotateCertificates: true
    runtimeRequestTimeout: 0s
    shutdownGracePeriod: 0s
    shutdownGracePeriodCriticalPods: 0s
    staticPodPath: /etc/kubernetes/manifests
    streamingConnectionIdleTimeout: 0s
    syncFrequency: 0s
    volumeStatsAggPeriod: 0s
kind: ConfigMap
metadata:
  creationTimestamp: "2023-06-04T12:36:18Z"
  name: kubelet-config
  namespace: kube-system
  resourceVersion: "78161079"
  uid: 96d97fca-7bf0-4596-9e30-a2d00214a6f2

MetalLB - IPv6 And Dual Stack Services
IPv6 technically worked on my Hetzner baremetal provider.
In practice it requires patching the service to allow the Ingress (the PreferDualStack ipFamilyPolicy and IPv4/IPv6 ipFamilies -- see below).
And the netpol as well to allow the Egress (look for patch netpol akash-deployment-restrictions above).
This is something that akash-provider should be able to do, once it will officially support the IPv6 Dual Stack.

IPv6 And Dual Stack Services
IPv6 and dual stack services are supported in L2 mode, and in BGP mode only via the FRR mode.
In order for MetalLB to allocate IPs to a dual stack service, there must be at least one address pool having both addresses of version v4 and v6.
Note that in case of dual stack services, it is not possible to use spec.loadBalancerIP as it does not allow to request for multiple IPs, so the annotation metallb.universe.tf/loadBalancerIPs must be used.
https://metallb.universe.tf/usage/

metallb config
Here is the config that I've used in my setup:

<IP_ADDRESS> & <IP_ADDRESS> -- IPs picked I do not control. They seem to have to be added as for the service to receive both IPv4 & IPv6 addresses. (I've tested a deployment with 2 leased IPs)

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: default
  namespace: metallb-system
spec:
  addresses:
  - <IP_ADDRESS>/32
  - <IP_ADDRESS>/32
  - 2a01:4f9:6a:55d0::/125
  autoAssign: true
  avoidBuggyIPs: false
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2
  namespace: metallb-system

allow IPv4 & IPv6 ingress
kubectl patch svc ssh-ip-8022-tcp -n $ns --type='json' -p='[
  {"op": "replace", "path": "/spec/ipFamilyPolicy", "value": "PreferDualStack"},
  {"op": "replace", "path": "/spec/ipFamilies", "value": ["IPv4", "IPv6"]}
]'

kubectl patch svc ssh-ip-8080-tcp -n $ns --type='json' -p='[
  {"op": "replace", "path": "/spec/ipFamilyPolicy", "value": "PreferDualStack"},
  {"op": "replace", "path": "/spec/ipFamilies", "value": ["IPv4", "IPv6"]}
]'

root@node1:~/helm-charts# kubectl -n $ns get svc
NAME              TYPE           CLUSTER-IP      EXTERNAL-IP                        PORT(S)                         AGE
ssh-ip-8022-tcp   LoadBalancer   <IP_ADDRESS>   2a01:4f9:6a:55d0::,<IP_ADDRESS>    8022:32220/TCP                  4m13s
ssh-ip-8080-tcp   LoadBalancer   <IP_ADDRESS>    2a01:4f9:6a:55d0::1,<IP_ADDRESS>   8080:32265/TCP                  4m13s
ssh-np            NodePort       <IP_ADDRESS>   <none>                             8022:32036/TCP,8080:30357/TCP   4m13s

arno@x1:~$ curl -6 http://[2a01:4f9:6a:55d0::]:8080
curl: (7) Failed to connect to 2a01:4f9:6a:55d0:: port 8080 after 88 ms: Couldn't connect to server
arno@x1:~$ curl -6 -s http://[2a01:4f9:6a:55d0::1]:8080 | head -1
<!DOCTYPE html>
arno@x1:~$ ssh -p 22 root@2a01:4f9:6a:55d0:: "uname -n"
node1
arno@x1:~$ ssh -p 8022 root@2a01:4f9:6a:55d0:: "uname -n"
ssh-748dc4445-jflm6

After the deployment with IPv6 - akash-provider 0.2.1 breaks with the following symptoms:

provider-services lease-status hangs;
closing the deployment (lease) does not free up the CPU/mem/storage resources until you restart akash-provider pod; (even despite the deployment gets successfully closed);
provider sees new deployment order requests but isn't getting anywhere further than requesting reservation; (it also does report order closed, shutting down for the dseq when it is closed on the chain [and have never been actually deployed])

Initially, when I've added the /64 range with<PHONE_NUMBER>3709551615 or (2^64 - 1) hosts  (2a01:4f9:6a:55d0::/64), the akash-provider read there are<PHONE_NUMBER>854775808 available IPs.
I've then set it to 2a01:4f9:6a:55d0::/125 range so to have just 7 or (2^3 - 1) hosts.
But with that, the akash-provider pod broke until I lowered the IPv6 range:
I[2023-06-06|13:04:30.265] ip address inventory                         operator=ip in-use=0 available=9223372036854775808

provider error messsage:
ip operator remote error: http status 500 - unspecified error

@troian as agreed during the last sig-support BiWeekly meeting here is the spec.
Please let me know if that's what you were expecting and if you have any questions.

Technical Specification: Implementation of IPv6 Support in Akash Provider
Overview
This specification outlines the steps to implement IPv6 support in Akash Provider. With the wide adoption of IPv6, it's important to have dual-stack capabilities for both internal and external networking to ensure Akash Provider can operate on networks with IPv6 support.
Assumptions
1. The hosting machine supports IPv6 and the network has been configured to use IPv6.
2. The Akash Provider instance is running on Kubernetes and is managed using Kubespray.
3. Netplan is being used for network configuration.
4. You have administrative access to the cluster. (until Akash Provider updates the `akash-deployment-restrictions` ipBlock to the `::/0` IPV6 CIDR and patches the services's `ipFamilyPolicy => PreferDualStack & ipFamilies => IPv4, IPv6`)

Implementation

Enable IPv6 Support on Host
Check if the hosting machine supports IPv6:

ls -la /proc/net/if_inet6
sysctl net.ipv6.conf.all.disable_ipv6 net.ipv6.conf.default.disable_ipv6 net.ipv6.conf.lo.disable_ipv6 net.ipv6.conf.all.forwarding net.ipv6.conf.default.forwarding

Example output:
# ls -la /proc/net/if_inet6
-r--r--r-- 1 root root 0 Jun  4 06:03 /proc/net/if_inet6

# sysctl net.ipv6.conf.all.disable_ipv6 net.ipv6.conf.default.disable_ipv6 net.ipv6.conf.lo.disable_ipv6 net.ipv6.conf.all.forwarding net.ipv6.conf.default.forwarding
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.forwarding = 1

Update Netplan Configuration
Obtain an IPv6 address from the ISP (e.g., 2a01:4f9:6a:55d0::/64), and add it to the netplan configuration:

cat /etc/netplan/01.yaml

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true
      dhcp4-overrides:
        use-domains: false
      # disable accept-ra, otherwise it will bring search domains to your /etc/resolv.conf
      # refs [https://bugs.launchpad.net/netplan/+bug/1858503](https://bugs.launchpad.net/netplan/+bug/1858503)
      accept-ra: false
      dhcp6: false
      addresses:
        - 2a01:4f9:6a:55d0::/64
      gateway6: fe80::1
      routes:
      - to: ::/0
        via: fe80::1
        on-link: true

Update Kubespray Configuration
To enable IPv6, add the enable_dual_stack_networks: true to the kubespray/inventory/akash/group_vars/k8s_cluster/k8s-cluster.yml file.

Configure Calico for IPv6 NAT Outgoing
Add nat_outgoing_ipv6: true to inventory/akash/group_vars/k8s_cluster/k8s-net-calico.yml

Update Kubespray
Apply the Kubespray facts.yml, upgrade-cluster.yml, and cluster.yml playbooks in this order.

Post-Implementation Adjustments

Note that these adjustments (the akash-deployment-restrictions ipBlock to the ::/0 IPV6 CIDR update and the services's ipFamilyPolicy => PreferDualStack & ipFamilies => IPv4, IPv6 patching) should be supported by the Akash Provider.

Update Network Policies

New deployments (or ones with an updated manifest) will receive an IPv6 address. However, the network policy egress should be updated to support the ::/0 IPV6 CIDR. For example:
kubectl -n $ns patch netpol akash-deployment-restrictions --type='json' -p='[{"op": "add", "path": "/spec/egress/-", "value": {"to": [{"ipBlock": {"cidr": "::/0"}}]}}]'

Note that if the akash-provider pod restarts, this command will need to be rerun.

Patch the Service

In order to accept Ingress over IPv6, the service needs to be patched as follows:
kubectl patch svc mixnode-np -n $ns --type='json' -p='[
  {"op": "replace", "path": "/spec/ipFamilyPolicy", "value": "PreferDualStack"},
  {"op": "replace", "path": "/spec/ipFamilies", "value": ["IPv4", "IPv6"]}
]'

Test and Verification
Once the implementation has been completed, test and verify the setup by performing the following tests:
1. Test IPv6 Egress: Use the wget command to access a known IPv6 address, such as Google.
2. Test IPv6 Ingress: Deploy a simple service such as nginx and access it using the IPv6 address.
3. Additional Verification: Check the allocations of IPs and check the IP pools using the calicoctl command.
Risk and Mitigations
There might be potential issues with network latency and packet loss when adopting IPv6. Thorough testing should be done to ensure that these changes do not negatively affect the Akash Provider's performance. It's recommended to have a fallback plan to revert back to the IPv4 stack if any major issues are found during testing or production deployment.

Technical Specification: Implementation of IPv6 Support in MetalLB
Overview
This technical specification outlines the implementation of IPv6 and Dual Stack support in MetalLB (For IP Leasing offering). This enables MetalLB to operate in environments that use IPv6, IPv4 or both.
Assumptions
1. The Kubernetes cluster where MetalLB is deployed is running version 1.20 or later.
2. The cluster has IPv6 enabled.
3. You have administrative access to the cluster. (until Akash Provider does `ipFamilyPolicy => PreferDualStack & ipFamilies => IPv4, IPv6`)

Implementation

Configure MetalLB for IPv6 and Dual Stack Services

MetalLB supports IPv6 and dual stack services in L2 mode and in BGP mode only via the FRR mode.
For MetalLB to allocate IPs to a dual stack service, there must be at least one address pool containing both v4 and v6 addresses.
MetalLB Configuration:
The configuration below should be placed in a file named metallb-config.yaml:

This is an example configuration with known IPv4  IPv6 addresses.

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: default
  namespace: metallb-system
spec:
  addresses:
  - <IP_ADDRESS>/32
  - <IP_ADDRESS>/32
  - 2a01:4f9:6a:55d0::/125
  autoAssign: true
  avoidBuggyIPs: false
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2
  namespace: metallb-system

After creating the configuration, apply it using the following command:
kubectl apply -f metallb-config.yaml

Configure Service for IPv4 & IPv6 Ingress

Note that these adjustments (ipFamilyPolicy => PreferDualStack & ipFamilies => IPv4, IPv6) should be supported by the Akash Provider.

To allow both IPv4 and IPv6 ingress, patch the services using the following commands:
kubectl patch svc ssh-ip-8022-tcp -n $ns --type='json' -p='[
  {"op": "replace", "path": "/spec/ipFamilyPolicy", "value": "PreferDualStack"},
  {"op": "replace", "path": "/spec/ipFamilies", "value": ["IPv4", "IPv6"]}
]'

kubectl patch svc ssh-ip-8080-tcp -n $ns --type='json' -p='[
  {"op": "replace", "path": "/spec/ipFamilyPolicy", "value": "PreferDualStack"},
  {"op": "replace", "path": "/spec/ipFamilies", "value": ["IPv4", "IPv6"]}
]'

Test and Verification
After applying these configurations, test and verify the setup by checking if the services have received both IPv4 and IPv6 addresses. The following command should display these addresses:
kubectl -n $ns get svc

Example output:
NAME              TYPE           CLUSTER-IP      EXTERNAL-IP                        PORT(S)                         AGE
ssh-ip-8022-tcp   LoadBalancer   <IP_ADDRESS>   2a01:4f9:6a:55d0::,<IP_ADDRESS>    8022:32220/TCP                  4m13s
ssh-ip-8080-tcp   LoadBalancer   <IP_ADDRESS>    2a01:4f9:6a:55d0::1,<IP_ADDRESS>   8080:32265/TCP                  4m13s
ssh-np            NodePort       <IP_ADDRESS>   <none>                             8022:32036/TCP,8080:30357/TCP   4m13s

You can also verify if the services are reachable over IPv6 using curl for HTTP services and ssh for SSH services.
Risks and Mitigations
IPv6 support in MetalLB might have some limitations due to underlying network conditions. It's crucial to perform thorough testing in a staging environment before implementing in a production setting. It is also recommended to have a fallback plan to revert back to IPv4-only mode if major issues arise during testing or after production deployment.
Please note, during initial tests, the provider may fail if there are too many hosts in an IPv6 pool. If this is the case, try using a narrower range to mitigate the issue. For example, changing /64 to /125 reduces the total number of available IPs, potentially avoiding a problem with the provider not handling a large number of IP addresses.

We can then use the ipv6: <true|false> provider attribute for the tenants to find it the provider that supports the IPv6.


Graphback CLI missing docs

The graphback-cli doc page is empty at the moment - http://localhost:3000/docs/cli/graphback-cli.
Opening this issue to add a paragraph or two.

/cc @craicoverflow, @wtrocki
Automatically generated comment to notify maintainers

https://graphback.dev/docs/cli/graphback-cli


Azure Page type nextLink properties should be readOnly: true

This PR fixes https://github.com/Azure/typespec-azure-pr/issues/3924 by marking nextLink properties with @visibility("read") so that the OpenAPI output for these properties contains readOnly: true.

:x: There is undocummented changes. Run chronus add to add a changeset or click here.
The following packages have changes but are not documented.

:x:@azure-tools/typespec-azure-core

You can try these changes at https://cadlplayground.z22.web.core.windows.net/typespec-azure/prs/231/
Check the website changes at https://tspwebsitepr.z22.web.core.windows.net/typespec-azure/prs/231/

@timotheeguerin We probably should mention it.  This is something that should have been set to begin with but got missed during Azure Core development. @allenjzhang and I discussed that it's worth introducing a break.  Anyone else have opinions here?  @markcowl @johanste


Building with XCode fails : main.jsbundle.map could not be found

Describe the bug
When build with XCode, react-native / Expo SDK43 using "@bugsnag/react-native": "^7.14.1", here is the error :
/bin/sh -c /Users/laurent/Library/Developer/Xcode/DerivedData/Shares-ffxwshugamgcxphhliriheesafcu/Build/Intermediates.noindex/ArchiveIntermediates/Shares/IntermediateBuildFilesPath/Shares.build/Release-iphoneos/Shares.build/Script-F1942C4D17D945208F03C662.sh

Error: SOURCE_MAP /var/folders/mw/kg3_gh9j26n8qd_w2sxkgkhm0000gn/T//884bc07e99d40030ad4d5ab846c7f5ac-main.jsbundle.map could not be found.
Ensure the --sourcemap-output option is passed to the react-native bundle command.
Command PhaseScriptExecution failed with a nonzero exit code

Steps to reproduce

npx @bugsnag/react-native-cli init
build with XCode

Environment

Bugsnag version: 7.14.1
Device (e.g. iphonex): XCode

Hi @lc3t35
When you say "build with XCode", I assume you're talking about an Expo app that you've ejected to the bare workflow with expo eject in order to work with it in XCode?
https://docs.expo.dev/bare/exploring-bare-workflow/
We believe we've reproduced the issue you describe and we're just looking into how to resolve.

Hi @lc3t35
We've identified the issue and will be preparing a fix.
A workaround until the fix is released would be to add the following into the Xcode project's "Bundle React Native code and images" build phase (before the react-native-xcode.sh script is called):
export EXTRA_PACKAGER_ARGS="--sourcemap-output $TMPDIR/$(md5 -qs "$CONFIGURATION_BUILD_DIR")-main.jsbundle.map"

Hi @lc3t35 - just to let you know that a fix for this was released in v7.14.2 of bugsnag-js 🎉

This does not work to fix the issue for us.

@systemlevel can you let us know some more details about the error that you're seeing, what steps you're taking in the run up to the issue, your configuration and environment?

@systemlevel can you let us know some more details about the error that you're seeing, what steps you're taking in the run up to the issue, your configuration and environment?

Thank you, we ran through the standard installation steps in your installation guide. We are running the latest React Native 0.67.2.
The setup CLI script automatically tried to add export EXTRA_PACKAGER_ARGS="--sourcemap-output $TMPDIR/$(md5 -qs "$CONFIGURATION_BUILD_DIR")-main.jsbundle.map" and I verified it was in there as well.
Android works but iOS is erroring out.

Hi @systemlevel, please can you share some more details about the exact error you're seeing, as well as some more details about your setup?
Is your project an ejected Expo app? What versions of Expo and Xcode are you using? Can you share the contents of both your 'Bundle React Native code and images' and 'Upload source maps to Bugsnag' build phase scripts?
If you'd prefer you can send these details to us directly at<EMAIL_ADDRESS>

@systemlevel - we haven't heard anything from you on this in a little while so we're not going to progress this any further at this stage, but do let us know if you can share any additional details and we'd be happy to investigate 👍


Plugin does not work on version 94 of FanControl

I have not tried using it on previous versions. When I open the list of sensors in the graph box, only the default sensors are available. Is there a way to enable the plugin?
Below I have attached screenshots of the plugin folder and my hwinfo settings in case I did anything wrong.
Edit: I'm using v6.42 of hwinfo, without the shared memory limiter.

I have the same problem. I can't get Fan Control to recognize the HWiNFO64 Plugin.
I am not sure what you mean by "sensor read mode".
I only downloaded the four files and copied them into the Plugins Folder, as seen in the second screenshot. Do I have to edit the files in any way?
Do I have to use the files from FanControl.HWInfo as well?
Thank you for your time!

@user2am

Okay, that is what I am using.
Do we have to use your files? I only downloaded the four files from AppVeyor, as explained in the README.md. I did not use any of the files of this repo (e.g. "FanControl.HWInfo.csproj"). Maybe I am misunderstanding the installation guide?

Make sure all the plugin dlls are unlocked.   Right-click => properties.
Make sure HWInfo is running b4 FanControl.

Unlocking the dlls worked! I would have never thought of this. Thank you so much!


[Adding Tool]: Add VSDC

What tool are you adding and to what category?
We need to add
VSDC is a full-featured free video editing tool that you can install on Windows. A fair warning though: This program might be a little hard to use for beginners because of the number of features and menus.
Add Tool Link
Add tool link
http://www.videosoftdev.com/free-video-editor
Code of Conduct

[X] I agree to follow this project's Code of Conduct
[X] The tool is free for use

assign me


Configure pipeline to dynamically scale to handle large fastq files/large numbers of fastq files

We either need a way to decide how many cores/node/whatever we will need before a pipeline run, or we need the pipeline to dynamically scale cores/node/whatever to what it needs while running. Long term, we can't be in a situation of not knowing the pipeline needs more compute resources until after a run fails.
adammaikai:house_with_garden:  9:55 AM
So we need some new things -
an updated script that runs single samples
potentially change the resource requests from 1 to 2 cores
....
katie  9:57 AM
@adammaikai how big are those files? fastqc runs on wgs and big files all the time that are way bigger than a few GB, so I wonder if it’s something else that cuased them to hang?
9:57
or did they just start or?
adammaikai:house_with_garden:  9:58 AM
They aren't big but it was the simultaneous run of 96 samples on one node, which is why I think we need to change to running only 48

Specifying this: "get AWS to allow us to scale to larger numbers of spot nodes".  Latest status:
2021-03-30
amanda  2:25 PM
katie did the “limit of 5 spot nodes” issue get dealt with? If we are going to do this run of big data for Niema, it would go much faster with more nodes …
katie  2:25 PM
i submitted the request but checked this morning and can’t find anywhere where there is a response and the limit is the same as it was before


acme: "Selected IO plugins do not cover the following components: account_reg." (with fix)

Describe the bug
This is more advisory than anything.
If you see something like:
Dec 23 14:37:05 flexo.gsc.io simp_le[15797]: 2019-12-23 14:37:05,793:DEBUG:simp_le:1522: ('-v', '-d', 'flexo.gsc.io', '--default_root', '/var/lib/acme/acme-challenge', '--valid_min', '2592000', '--email'<EMAIL_ADDRESS>'-f', 'cert.pem', '-f', 'fullchain.pem', '-f', 'full.pem', '-f', 'key.pem', '-f', 'account_key.json', '-d', 'events.nix.gsc.io') parsed as  ...
Dec 23 14:37:05 flexo.gsc.io simp_le[15797]: Selected IO plugins do not cover the following components: account_reg.
Dec 23 14:37:05 flexo.gsc.io simp_le[15797]: Debugging tips: -v improves output verbosity. Help is available under --help.

you need to edit services.acme.certs.NAME.plugins to include account_reg.json. This is automatic by default, and only needed if you specify a custom list.

system: "x86_64-linux"
host os: Linux 4.19.89, NixOS, 19.09.1590.d85e435b7bd (Loris)
multi-user?: yes
sandbox: yes
version: nix-env (Nix) 2.3
channels(root): "nixos-19.09.1590.d85e435b7bd"
channels(grahamc): ""
nixpkgs: /nix/var/nix/profiles/per-user/root/channels/nixos

It would be good to have an ability not to modify custom plugin list when something like this happens. Maybe add a new additionalPlugins option, or providing the "default" list of plugins somewhere...


Load folder settings when workspace uses a new FileSystemProvider (fix #182309)

This PR fixes #182309.
To verify, check that the repro on the issue now works correctly.

/assign @sandy081

@sandy081 any chance you could look at this ahead of endgame?

When cache is used, we resolve the folder configuration later and emit configuration change event if there is a change. It seems in this case, configuration change event is not getting triggered. Can you please check if this is true?

@sandy081 the problem is that cache wasn't even being used in this situation, regardless of whether or not the folder's uri depended on a FSP that wasn't yet available, because this.initialized had already been set true.
I have reverted my original change and made a different one.

@gjsjohnmurray Thanks for the fix. Even though the fix works, I think it is not the right fix. Because, we would like to use cache only when workspace is not initialised. In this case, it is getting re-initialised with different workspace and therefore we have to use cache. This mean, initialized flag has to be reset. I prepared another fix and created the PR - https://github.com/microsoft/vscode/pull/183925 - Closing this PR in favour of that. Again very much appreciated for looking into this.

Thanks @sandy081. Happy to have helped get the correct fix done.


The Download Link is only for 64 Bit

Getting an error at windows 32 bit this no a windows 32 bit application or something like that.

44d67f6
Changed Readme for x64


Expose a PodDisruptionBudget configuration for the Metering operands.

This updates the MeteringConfig CRD schema and API, exposing a configuration for managing PodDisruptionBudget resources for the operand Pods. By default, this is enabled for all of the operands, except in the case where there are no Presto worker replicas. In the case where a user may need to upgrade a node and an operand's PDB resource is blocking a node from draining, you have the ability to disable that resource and re-enable once the upgrade process is complete.
For example, disabling the PDB for the reporting-operator would require editing the MeteringConfig custom resource:
apiVersion: metering.openshift.io/v1
kind: MeteringConfig
...
spec:
...
  reporting-operator:
    spec:
      podDisruptionBudget:
        enabled: false
...

Once that custom resource has been edited, the metering-ansible-operator should purge that resource during it's next reconciliation.
I also added an e2e test for ensuring the correct number of PDB resources gets created, which is probably a good candidate for molecule testing the metering-ansible-operator if we had that testing infrastructure set up. We probably need to beef this up long term to test reconciling non-default configurations, e.g. ensuring the enabled: false results in a deleted PDB(s).

/test ci/prow/verify

/test verify

Did someone already require that Metering is an application such that: You are the owner of an application running on a Kubernetes cluster that requires high availability.

/lgtm
Maybe for another story just wondering about that comment about e2e test on draining a node and seeing continued functionality.

I want to think whether this kind of configuration makes sense some more before we tag it in.
/hold


Now PDFDocument could be initialized from NSData

There are some cases, when you haven't stored PDF file on disk, so you have not url for it: for example, when you just loaded PDF from network.
I just added constructor to PDFDocument class that allows to work with PDF file via NSData.

@scoreyou thanks for going through and adding this functionality. I've merged in your changes along with a few minor modifications and published it to CocoaPods


Change output filename format

Hi
Could there be an option (or change the current default) to use a more media server friendly name?
Should be Series Name S[xx]E[xx]-[Optional episode name]

Hi, this is related to https://github.com/odinuge/nrk-tv-downloader/issues/23. I have a commit for what you are looking for in my fork, but it's not very robust yet.

Ah, I missed that issue. Closing this then, since it's a duplicate.

Nice work @eithe. Will look at (and hopefully get it into master) tomorrow :smile:
CC: @drtomasso


Fix problems with high load on RUDP

There are currently problems with high load as demonstrated with BenchmarkNet. Hazel should not fall at any of the BenchmarkNet tests let alone at such an early test.

Not so bad ;-)

It's not too bad, but it still indicates a problem somewhere that could always trip up lower client counts in the wrong circumstances!

How can we fix the problem? Using Profiler?

Profiler won't help here really, just need to find the set of locks causing the deadlock (assuming it's a deadlock)

Now the thing that really matters is just fixing the module crash that happens when more than 500 clients connected to the server.

DarkRift 2 was originally going to be built on top but was changed during the development to a simpler bi-channel TCP/UDP setup to make it easier to maintain.

Good spot, I forgot about that. Fixed.

Since building robust RUDP is not easy and RUDP may be implemented in different way (e.g. reliable with order, reliable without order, unreliable with order, ...). I suggest you to drop RUDP from Hazel and maintain bi-channel TCP/UDP communication like DarkRift2. This way, maybe the DarkRift2 may use Hazel again in the future?

I don't think it would be fair to drop a connection method, there are people who use Hazel for it's RUDP and it would mean they had to change otherwise.

Okay, I feel like I'm resurrecting something here, but I wanted to gather some opinions.
Someone randomly suggested I run @nxrighthere's Benchmark.NET project against the fork of Hazel I've been developing for the last year or so. They had concerns with this issue showing up in those tests. Since I've been running my fork in production for 6+ months at 500+ users, I'm not surprised that I have fixed this issue.

However I noticed Hazel is leading in bandwidth, and I'm sure my fork has better memory and CPU characteristics as well since I've removed several locks, allocations, and buffer copies.
The changes are deep enough and my focus diverged from @JamJar00's enough that I have considered rebranding entirely. But I've been developing strictly for my personal uses and I'm not really a "maintainer", I don't have a strong feel for if that is the right choice.
So uh, tl;dr. Is it possible I can get an external reading of my progress? The necessary changes to the benchmark are very simple. Should I rename my fork and part ways (with credit, of course) or is there room for an almost certainly breaking change PR?

I vote for rebranding! Please had some simple example client-server. And Unity simple example, it is very usefull! Hazel next gen is back! Thank you for your help!

What would the breaking change(s) be and how hard are they to compensate for in my code?

Well, if you hopped to my code verbatim:

I have removed fragmented RUDP entirely. Nothing about my code is incompatible, I didn't need it and it would have taken extra time to fix as I was plumbing MessageReader/Writers. A PR would probably take the time to readd this. Shouldn't be too hard, since it mostly piggy-backs on unfragmented RUDP.
TCP was removed and eventually readded from scratch, so I have no idea how compatible they are. This could cause some real problems in a PR picking one side or the other.
DataReceived events now have a MessageReader instead of raw bytes. These are pooled and need recycling.
client.DataReceived += (connObj, evtObj) =>                { ...                      evtObj.Recycle();                };
is now
client.DataReceived += (evtObj) =>                { ...                      evtObj.Message.Recycle();                };
This is the bulk of the library users' work. I strive to keep the MessageReader compliant with BinaryReader, but who knows how people are using the bytes currently. It puts additional pressure on library users to manage lifetimes and track down leaks, but also gives a few tools (counters and logging) for doing so.

Users could hack around it with Buffer.Copy(target, 0, evtObj.Message.Bytes, 0, evt.Message.Length). But some people might also think less of those users.

Ideally, users use Send(MessageWriter) instead of SendBytes(byte[]) as well, although the latter does still exist and works well for fixed, unreliable messages.
Disconnecting was reworked pretty heavily, though users should only notice that it requires a string reason because I didn't like all the wrapped exception stuff. But I'm not 100% if there are semantic differences as well. (eg. Dispose doesn't call OnDisconnect, Disconnect calls Dispose.) There may be more/less/different exceptions than previous.

There may be other things. I haven't pulled up a diff or anything.

Well, this is an interesting surprise! It's always nice to see Hazel still in use!
Frankly, the last real commit I made to Hazel was over a year ago so we might as well be honest with ourselves and call this a dead project. Whatever comes next is a revival.
Since you have breaking changes, and by the sounds of it a lot of divergence, I doubt there's any way a change such as that proposed could be a minor release. Therefore, I suggest there's only two practical paths to go down here:

You do a PR, we merge in your changes, perhaps with some prior editing for minor details, and then we release as Hazel 1.0.0; or,
you continue as is, with an optional rebrand if you want to (I'm not fussed if not!), and I will gladly point to your fork as the 'official'/'main' continuation of Hazel.

In my mind Hazel's been all but officially dead for years now, and I have no intention of continuing development on it myself. I've said personally that I would be happy to pass the project on if someone is able to give it the love, time and real application that it requires and I am unable to provide, and I'm happy that you've already shown that.
I would suggest, therefore, we do the latter option and I pass the reins on to you for the future.
I thoroughly enjoyed working on Hazel and the unique challenges its implementation posed for me, and I really wish I had the time to invest in it to making it better. If you're happy to take over Hazel 'officially', I'd be more than happy to pass the baton to you :)
Jamie

Oh! If you're fine passing on the whole shebang, then I'd be honored! I'll pop into the DR2 discord and make myself known in case it'll smooth anything over.

Glad you're happy to take over! I'll add notices to GitHub/Nuget and make announcements when I have a bit more time later this week if that's ok with you.
Feel free to hang around in the Discord, people are most welcoming there, and you're more than welcome to send future questions over to me if you think I'll be able to help!
I'm honestly delighted that Hazel isn't just another abandoned project!

Apologies I haven't done this yet, I haven't had much time! I haven't forgotten though! 🙂

No worries! I have plenty of my own business to mind.
Me and my one post can be found here: https://forum.unity.com/members/fortebass.988271/

Is there PR available for these changes?
I'm getting a lot of disconnects with high packet load. My stress test goes crazy with resends at around 500+ packets per second.

There is no PR for this. Rather my fork has overtaken Jamie's. There are
some usage differences, but they should be relatively easy to navigate.
https://github.com/willardf/Hazel-Networking
I also have a big usage example repo, but I recognize that I need to put
some simpler usage scenarios in the Hazel wiki or something.
https://github.com/willardf/Hazel-Examples
On Fri, Jun 21, 2019 at 12:35 PM Dan Stovell - dstovell <
<EMAIL_ADDRESS>wrote:

Is there PR available for these changes?
I'm getting a lot of disconnects with high packet load. My stress test
goes crazy with resends at around 500+ packets per second.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/DarkRiftNetworking/Hazel-Networking/issues/12?email_source=notifications&email_token=AAJTL6SSUOUNUFGFW7N46ODP3UUOLA5CNFSM4EPSLDH2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODYJMUWA#issuecomment-504547928,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AAJTL6QIVHAP7LLDIHP5ZLTP3UUOLANCNFSM4EPSLDHQ
.

I'm actually already looking at what I need to change to integrate. Thank you!

@willardf tried out your fork and it seems to work better with high packet counts. I'm looking at hooking up DTLS and I'm wondering if you have an "nice to knows" about using it with Hazel.
Sorry for the reply here, looks like the issues tab is not available on your fork.

Hey @dstovell-kabam. Wow, sorry I completely managed to miss your message for months. I opened up the issues tab so you can recreate something there. But in general, I have no experience with DTLS or secure UDP, so I'd be very interested in seeing what that looks like.
Given my complete lack of knowledge, I doubt there should be any gotchas around it. Just try to preserve the MessageReader/Writer interactions with the UdpConnection subclasses. Putting normal data in and getting normal data out is the key to keeping things happy in Hazel.


switches to correct thousands suffix (k)

T is for trillions, k is for thousands.
https://en.wikipedia.org/wiki/Metric_prefix#List_of_SI_prefixes

Thanks @sneak! Guess the German false friends struck again :D Fixed it.


Bug: False Positive prompt is incorrectly triggered when the Format Your Code tip is run by a user

Example of this occurring in python

Since feedback is a development feature which is dynamically added to things we are testing, it is only present in production and not on github.
I had added the view to all tips since detect_code used to send a /tip. Since it no longer does, The view should only be present in detect code. This has been fixed in production.


Blocked by Cisco Umbrella

It would be nice to be able to use identifiable search entities.
ddg-webapp-aagd.vercel.app
is being identified as malware.

Thanks for the feedback. This is a temporary backend. Maybe in the future I'll move it somewhere else.


Update gitignore for Idea projects

Updated gitignore to exclude "out" folders which contain temporary build files and copies of assets in Intellij Idea.

As discussed on Discord this looks like a specific environment/configuration issue on OP's machine. After some testing on different newly generated projects, /out folders are never created by default on imported libGDX projects on IDEA.
Even if it's a minor thing imo the PR should be closed unless new information on how to reproduce is provided.


 Or should I merge

Sorry. I haven't gotten around to it. I'll do it, don't merge yet.

Wait I did do it

I just forgot to remove the Todo


startDiscoveryFailed every time

Hi!
I am playing with this as a replacement for flutter_mdns_plugin, followed docs and example, and I am getting an startDiscoveryFailed nsd everytime. I am specifically looking for chromecast devices with:
await flutterNsd.discoverServices('_googlecast._tcp');

There is no other native log I can follow. This happens both on Android and iOS, both recent devices ...
Any idea?

did you try the example?


Type error setting pointStype to false

Expected behavior
I hope I can define a dataset with a boolean pointStyle without getting a typing error
Current behavior
When i add the following config:
new Chart(canvas, {
    type: 'line',
    data: {
        labels: generateLabels(),
        datasets: [
            {
                label: 'Dataset',
                data: generateData(),
                pointStyle: false, <--
            },
        ],
}

I get the following typing error
Type '{ pointStyle: boolean; }' is not assignable to type 'ChartDatasetCustomTypesPerDataset<"line", number[]>'.
Reproducible sample
https://codesandbox.io/s/ng2charts-chart-js-issue-template-forked-r5kcm4
Optional extra steps/info to reproduce
It is currently "fixed" by forcing a type as shown here
pointStyle: false as unknown as string,
but I wouldn't want to have to do this.
Possible solution
No response
Context
I am working on Angular 16
chart.js version
4.3.0
Browser name and version
Firefox Developer Edition 115.0b9 (64-bit) on Ubuntu
Link to your project
No response

The codesandbox you linked is in version 3.7.1. If you update the version it works fine:
https://codesandbox.io/s/ng2charts-chart-js-issue-template-forked-zjsm79?file=/src/app/app.component.ts


4136

Fixed Issue(added feature):
#4136

@naresh-webkul
by default, wishlist option should be enabled for all locale

when you will run db:seed while installing the project the value will be inserted for the wishlist option.


Use 'Cache' Class in past_key_values for transformers

What behavior of the library made you think about the improvement?
See bottom of https://github.com/huggingface/transformers/releases/tag/v4.36.0
Also, a static cache implementation is on its way.
#https://github.com/huggingface/transformers/pull/27931
Currently I am working on a ExllamaV2 integration, but the problem is that ExllamaV2 already utilizes its own cache instance, without passing it around. The cache is also static, which is not compatible with the dynamic shaped cache that is currently passed in Transformer.forward(). With this new Cache abstraction, it would be easier to implement static cache & ExllamaV2 integration.
How would you like it to behave?
It's not hard to replace current 'past_key_values' to the new 'Cache' instance, as it is replacable with the newest version of transformers. The problem (or the design choice) is whether make the model hold the Cache instance, or make a new Cache for every call.
Could collide with #441.

I have a few very naive questions and remarks:

Does that mean that HF transformers is going to cache KV values by default?
We were planning on implementing a better and more general KV-caching solution based on tries to minimize the memory impact for Beam Search, not sure that will be necessary anymore after this change in transformers?
If you look at the Mamba integration you will see that you can return None for the KV cache and can implement the __call__ and forward method to catch the KV values without using them. That's probably what you'll need to do for the ExLlamaV2 integration (which would be awesome to have!)

No, HF transformers does not cache KV values by default. The new Cache class introduces a structure that could be modified for advances uses, instead of just a tuple containing KV values.

Rough code would be something like this:
from transformers import Cache, DynamicCache class Transformer:     """Represents atransformers` model."""
def __call__(
    self,
    input_ids: torch.LongTensor,
    attention_mask: torch.LongTensor,
    past_key_values: Optional[Cache] = None,
) -> torch.FloatTensor:
    if not past_key_values:
        past_key_values = DynamicCache()

    # returned kv_cache type is also Cache, not tuple
    logits, kv_cache = self.forward(input_ids, attention_mask, past_key_values)
    next_token_logits = logits[..., -1, :]

    return next_token_logits, kv_cache

`

It looks like #441 is implementing a disk cache, but I think this is not optimal because you are moving GPU tensors to CPU every time the model generates. A GPU cache that resides inside the model instance would be more faster, with a slight VRAM increase.
We would have to compare performance with wallclock speed / VRAM to check this out.
Thanks, I will upload a draft PR soon.

This looks awesome and seems to be right way to go! We also have some ideas around cache management that are complementary to yours and it would be nice to try to make it work with your new abstraction.

One quick question @gante: we have our own generation layer in Outlines and don't use generate. Can I use a Cache instance for past_key_value and it will work out of the box or do I need to do something to update it manually?

@rlouf the model instance will take care of updating the cache instance :D
Please note the verb tense, future. At the moment, only Llama + static cache works this way. We are working on expanding this mechanism to all cache types/models, but it's hard for me to provide a time estimate. I expect Llama + all types of caches to be ready next version (v4.39), with other key models being enabled in the subsequent version (v4.40).
A manual update of the cache will also work, with the advantage that it works now :)


[BEAM-11994] Update BigQueryServicesImpl to capture API_REQUEST_COUNT metrics for streaming inserts mode

[BEAM-11994] Update BigQueryServicesImpl to capture API_REQUEST_COUNT metrics for streaming inserts mode

Update the retry logic to retry failed RPCs with backoff, so that batch jobs do not fail too quickly on errors, and give more attempts to retry.
Add ServiceCallMetric wrapper class to properly report the message with correct error codes. (Ported from Python)
Add ResourceIdentifiers to help construct the RESOURCE label used on API_REQUEST_COUNT metrics.

Thank you for your contribution! Follow this checklist to help us incorporate your contribution quickly and easily:

[ ] Choose reviewer(s) and mention them in a comment (R: @username).
[ ] Format the pull request title like [BEAM-XXX] Fixes bug in ApproximateQuantiles, where you replace BEAM-XXX with the appropriate JIRA issue, if applicable. This will automatically link the pull request to the issue.
[ ] Update CHANGES.md with noteworthy changes.
[ ] If this contribution is large, please file an Apache Individual Contributor License Agreement.

See the Contributor Guide for more tips on how to make review process smoother.

GitHub Actions Tests Status (on master branch)

See CI.md for more information about GitHub Actions CI.

R: @ihji

Folks, what is the next step on this PR?

Run Java PreCommit

What is the next step on this PR? Could this be merged?

Not waiting for review, discussed offline. Need to make some changes. Will get to it in in about 3 weeks.

retest this please

R: @ihji. I removed all the retry logic changes from this PR. Let's compete the review now. This PR now only introduced the new metric.
Also, @ihji
I think Java Tests / Java Unit Tests (macos-latest) (pull_request)  is a flakey test suite and I can't rerun it. Can you rerun it?


Should UW be included in the phoneme set?

Should UW be included in the phoneme set?
It seems g2p.phonemes operates under the general rule of of excluding the 'parent' category when its variants exist. For example, AA is not included since its variants AA0, AA1, AA2 are in the set. Same for AE, AH, AW, AY, etc. But UW seems to be the only exception. Furthermore, when I do simple frequency analyses on sizable corpora (not super rigorously though), UW never occurs while its variants do. I wonder if the phoneme set can safely forgo UW.

I have the same question for this.


Change 'Deprecated on' to 'End of life on'

Change 'Deprecated on {date}' to 'End of life on {date}' to better reflect the state of the library while in transition between date of deprecation and end of life date.

@mario-guerra is the date we are putting in here representative of that? Do we need a separate deprecated and EoL date?

The PR description is poorly worded, my bad. I don't think we need two dates. If I were a customer I would care more about the future end-of-life date, which is what this represents, than the deprecation date that has already passed.

OK we should probably also update the CSV column to rename it to EOLDate instead of DeprecatedDate to avoid in confusions. (https://github.com/Azure/azure-sdk/blob/main/eng/README.md) I will take an action item to do that.

Good idea, thanks Wes.


Updated go version to 1.19 in jx-helpers

Signed-off-by: PratikforCoding<EMAIL_ADDRESS>

/ok-to-test


--phased option for methylartist region

Hi,
first of all: really nice tool! Works great. However, is there a reason that you did not implement the --phased option for methylartist region?
Thanks!
Max

Fixed in 1.0.6


merge package from arlac77/npm-package-template

package.json

chore(package<EMAIL_ADDRESS>chore(scripts): cover@#overwrite c8 --temp-directory build/coverage ava && c8 report -r lcov --temp-directory build/coverage
chore(package): add xo from template
chore(package): add nyc from template
chore(package): set $.ava.require='esm' as in template
chore(package): set $.ava.files='tests/-test.js,tests/-test.mjs' as in template
chore(package): set $.ava.extensions='js,mjs' as in template

Codecov Report

Merging #531 into master will not change coverage.
The diff coverage is n/a.

@@           Coverage Diff           @@
##           master     #531   +/-   ##
=======================================
  Coverage   72.65%   72.65%
=======================================
  Files           3        3
  Lines         490      490
=======================================
  Hits          356      356
  Misses        134      134

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 8b5e437...a7588d0. Read the comment docs.

Coverage remained the same at 73.89% when pulling a7588d0bf6eb64d082edb1471fc731cfe0ec52df on template-sync-1 into 8b5e437c15081b4277566e62fc42c583e9e26584 on master.

:tada: This PR is included in version 5.0.0 :tada:
The release is available on:

npm package (@latest dist-tag)
GitHub release

Your semantic-release bot :package::rocket:


[PSM Interop] Log Google Cloud API debug header

Add Google Cloud API debug header and read response.
Testing

Triggered in Prod, no header was logged: https://source.cloud.google.com/results/invocations/c91c6e81-5e5b-4545-8abf-28594d4493a5
Triggered in Prod with debug header enabled: https://source.cloud.google.com/results/invocations/cfda4dd5-e3a9-4519-a4e7-85220f780cbf
Also tested locally in staging.
Example log:

I0913 01:04:19.688863<PHONE_NUMBER>66944 traffic_director.py:187] Creating GRPC Health Check "xds-k8s-test-health-check-dev"
I0913 01:04:19.692854<PHONE_NUMBER>66944 compute.py:538] Creating compute resource:
---
grpcHealthCheck:
  portSpecification: USE_SERVING_PORT
name: xds-k8s-test-health-check-dev
type: GRPC
...

I0913 01:04:19.693941<PHONE_NUMBER>66944 compute.py:600] Adding debug headers for method: compute.healthChecks.insert
I0913 01:04:20.726086<PHONE_NUMBER>66944 compute.py:595] Received debug headers:
ADViAh6vFBtRL4YCoe622ssZK297mvPAmEmv7mbNs+CgHLLXi7hwphTvxN5Ssh9LNB+Jgdu3Go3/12y1yxh9qRaTjov2Gukiqf9yDkgE9VywDwmXk6FNHkYwWO9Rq5AyfkBYL82d90fC7mH8ZdLqzrGhXiGwl5jtF4hA1xg9c1dnKEsSWlrBBPePHzpVb52CKy6C/I4SXdeiXTp9ORHJJwGu1qA75xCqMEf4btOw0GML+j3e...
I0913 01:04:20.726562<PHONE_NUMBER>66944 compute.py:610] Waiting 600 sec for compute operation id: operation-1694567059990-6053323a8a81a-5340529e-bf5d5c03
I0913 01:04:23.383233<PHONE_NUMBER>66944 xds_k8s_testcase.py:272] --- Finished subTest __main__.BaselineTest.test_traffic_director_grpc_setup.0_create_health_check ---

@sergiitk PTALA

[ ] grpc/java/v1.58.x/branch/xds_k8s_lb
[ ] grpc/java/v1.58.x/branch/psm-security
[ ] grpc/java/v1.58.x/branch/xds_url_map


[TODO] Add dict-send support for HiSockServer

What is needing to be done currently?
Well, since I added dict-sending support for HiSockClient...
Why aren't you doing it right now? >:(
Duh.

I swear I'll do it today :weary:

and lol it's HiSockServer not HiSockClient

Added

thanks @SSS-Says-Snek :)


Update for sneaky game update?

Description
RED4ext appears to terminate on launch due to file version mismatch.
Steps to reproduce

Latest version of game and RED4ext
Launch game
Either RED4ext terminates or instant crash (depends on installed plugins)
Check logs

Expected behavior
RED4ext and installed associated plugins function as normal.
Examples
Log I got for reference.

[2022-04-05 11:16:57.718] [RED4ext] [info] RED4ext (v1.5.0) is initializing...
[2022-04-05 11:16:57.718] [RED4ext] [info] Game version is 1.52
[2022-04-05 11:16:57.718] [RED4ext] [info] File version <IP_ADDRESS>6
[2022-04-05 11:16:57.718] [RED4ext] [error] This game version (1.52) is not supported
[2022-04-05 11:16:57.718] [RED4ext] [error] The current version of RED4ext supports only file version <IP_ADDRESS>169, try updating the mod or downgrading the game
[2022-04-05 11:17:29.320] [RED4ext] [info] RED4ext is terminating...
[2022-04-05 11:17:29.320] [RED4ext] [info] RED4ext has been terminated

Game details (please complete the following information):

Platform: Steam
Version 1.52

Additional context
Seems like there was some kind of sneaky ninja update to something overnight. Everything was working fine yesterday. Tried playing today and it crashed. After troubleshooting, the TweakXL plugin caused it to crash, but the author says it's RED4ext that needs an update this time.

Thank you for the report! Unfortunately I could not reproduce it :(
Could you please tell me if you see a message on the screen before this happens and what plugins do you have installed?

I don't see a message. The only plugins I have installed are TweakXL and ArchiveXL, and I see the "missing or corrupted scripts" crash error only when the former is installed. Otherwise, the game launches normally, but it seems like without RED4ext.
Though it has occurred to me to ask, does this output that RED4ext is terminating when the game shuts down or does it only terminate like that when some version is mismatched?

From the error, I assume it is because you also have redscript installed right? TweakXL provides some scripts that are loaded by redscript, if RED4ext fails to load or TweakXL is not loaded, redscript will produce that error.

Though it has occurred to me to ask, does this output that RED4ext is terminating when the game shuts down or does it only terminate like that when some version is mismatched?
This output is generated when the RED4ext is unloaded from the memory. Might be when the game shutdown, but might also be something else.

I think a better wording for this would be RED4ext is unloading... and RED4ext is unloaded.

I'm pretty sure I have it installed correctly. Like I said, everything was working fine yesterday, and I made no changes to any installed mods between when I stopped last night and when I tried to launch this morning. The only thing I can think of that would've affected this based on that log is that there was some kind of tiny update to whatever file RED4ext checks. But then I'm not a modder myself, thus my report.

The message you showed above, missing or corrupted scripts is generated by the game because RED4ext will not load TweakXL / ArchiveXL and another mod is having dependencies on it.
Anyway, this would happen because as you said, there was a sneaky update. I released a new version, v1.6.0. Could you try with this version and tell me if it works?

Looks like that works. Still getting the script crash, but looking at the log, it looks like that's because the plugin authors will have to update their plugins to match. I'll let them know. RED4ext appears to have started fine.

Thanks for testing! I pushed another version, v1.6.1. This one should load TweakXL and ArchiveXL.
It should be available on GitHub in few minutes.

Yup, that's got it. Game boots up, plugins loaded. Awesome!

Nice! Thank you for testing!


How to validate route configuration is correct

We have talked about this in the past, but I can't find an issue for it. If there is an existing issue this one should be closed and duped against it
Routes can be complicated in YARP, and mistakes in the routing configuration could allow for access to resources that should not be accessible without authentication/authorization etc. Operators of YARP proxies should have a way to be able to pass in URLs, headers etc., and validate what destination would receive the request, without having to rely on examining the response to validate the actual destination.

I remember talking about this but I don't know if there's an issue for it.
I have a branch with one experiment for this:
https://github.com/microsoft/reverse-proxy/blob/bca7d1e654aafa07b4f705a56d3906320703744d/testassets/ReverseProxy.Code/Startup.cs#L96
It lets you opt into a custom IProxyHttpClientFactory that replaces the outbound client with an interceptor HttpMessageHandler. The interceptor runs after routing, middleware, and transforms and then responds with a JSON representation of the full proxy request, including the route, cluster, and destination information.
https://github.com/microsoft/reverse-proxy/blob/bca7d1e654aafa07b4f705a56d3906320703744d/testassets/ReverseProxy.Code/InterceptorFactory.cs#L45-L59
That covers just about everything except issues connecting to the actual destination (e.g. cert trust, APLN, selected protocols, etc.).

Triage: Really nice to have, but not critical for 1.0.


hugolib: Use named keys in composite literals

Make go vet great again

Please wait with this, I have some massive commits in this area, and I'm not too keen on the merge job.

OK, the go vet errors was more annoying than a merge ... :-)


gh-149 1/2: fail when exercises is undefined

Add a condition to warn and fail if *exercises* is undefined in test-exercises.

^^ That's what is supposed to happen.

Looks good - thanks.


Merge prTesting_201905051021 branch to master branch

Docs Build status updates of commit 6dba868:
:white_check_mark: Validation status: passed

File
Status
Preview URL
Details
Dependent Files

split/updateTestRef.md
:white_check_mark:Succeeded

For more details, please refer to the build report.
Note: If you changed an existing file name or deleted a file, broken links in other files to the deleted or renamed file are listed only in the full build report.


link stage outputs correctly

The original implementation tries to find the outputs from the AnnotateDataset cohort by passing the Cohort, instead of passing the Dataset. This will probably cause the whole thing to explode.
Related: from recent runs the validation & udn-aus datasets have been removed from the default seqr-loader config
https://batch.hail.populationgenomics.org.au/batches/424408/jobs/1
https://github.com/populationgenomics/production-pipelines/blob/main/configs/defaults/seqr_loader.toml#L25
Was this removed because the stage was failing?

From discussion on slack, this stage was deliberately blocked off, probably because of the aforementioned failure
After this is fixed, we can use the output_prefix override to continue from the latest complete index and just generate VCFs

Thanks Matt. Yes it died and I assumed this was the cause - I just had not had a chance to go back to it. Thanks for digging it out.


Scan returns empty string depending on order

if i use
SELECT * FROM jobs , or
SELECT ID, url, props, handler, CINFO FROM jobs
rows.Scan(&k.ID, &k.Url, &k.Props, &k.Pid, &k.CINFO)

this always shows CINFO empty

but later i tried it again with
SELECT ID, url, CINFO, props, handler FROM jobs
rows.Scan(&k.ID, &k.Url, &k.CINFO, &k.Props, &k.Pid)

it works properly

it was doing something like this previously but i think something like this fixed it too .
where,
ID int
Url string
Props string
Pid int
CINFO string

Please provide a minimal reproducer, including the dump of the database file (including schema and data), as well as the Go code.

Sorry i tried to so this today but it do not reproduce, I should have zipped it then, i will upload it later if someting like this happens , i have double checked it before opeaning issue,
the function order was

open db

`
func LoadAllJobs() []JobsInfo {
jobs := []JobsInfo{}
//load contents
rows, err := Db.Query("SELECT * FROM jobs")
defer rows.Close()
if err != nil {
fmt.Println("Not found")
}
for rows.Next() {
    k := JobsInfo{}
    rows.Scan(&k.ID, &k.Url, &k.Props, &k.Pid, &k.CINFO)
    //fmt.Println("info",k)
	jobs = append(jobs, k)
}
return jobs

}
`

do other operations with those datas
but i have changed a lot of codes by then, and it was my 1st go code so ...

@rupakbajgain Please open a new issue if you are able to reproduce the problem.


Offer to create a workers.dev subdomain on wrangler publish if necessary

Offer to create a workers.dev subdomain if a user needs one
Previously, when a user wanted to publish a worker to https://workers.dev by setting workers_dev = true in their wrangler.toml,
but their account didn't have a subdomain registered, we would error out.
Now, we offer to create one for them. It's not implemented for wrangler dev, which also expects you to have registered a
workers.dev subdomain, but we now error correctly and tell them what the problem is.
Closes #535

@rozenmd it was only kind of in scope for the original issue, and then it got hairy around react stuff so i stayed away but i could do it here as well

oh nah we can always make a follow-up issue and someone does it later


CTM-ETM coupling migration of old refinery transformation inputs

To improve the coupling between the ETM and the CTM, new generic transformation nodes have been added for chemical_other, chemical_refineries and chemical_fertilizers. The generic transformation node for the refinery sector can transform crude oil to oil products, much like the existing refinery transformation nodes.
We have decided to migrate the external coupling transformation flows for refineries from the existing node to the new generic node. This PR handles that migration. The migration has not yet been run, so Semaphore fails on db schema.
To do for:

[ ] Check the migration and improve if necessary @noracato
[ ] The dataset values in line 63 do not work and likely require a JSON that holds the present year demand of the industry_refinery_transformation_crude_oil or the  industry_useful_demand_for_chemical_refineries_crude_oil_non_energetic node @noracato
[ ] Depending on the way the JSON is set up, perhaps we need to convert the data from the JSON from MJ to PJ
[ ] Check and run the migration @mabijkerk

@noracato I made some minor changes, most notably dividing the present demand by 1000.0 to get from TJ to PJ. Two questions:

What does the .gitkeep file do?
The not_defined input and output does not seem to be work.

The not_defined input should be set to 0.0 which should be simple enough to add I think? The not_defined output however should be allocated the refinery gas share. This is not the case now. In the example below, ~4% of output (refinery gas) is missing:


Add longer fade times

Would it be possible to have fade times up to 10 or 20 seconds? I use this at my church and there are automated times where background music needs to fade very slowly. I did a quick search through the code and it looks like it would be as simple as adding more choices to actions.js:148, but I'm not 100% sure.

It is not that simple. But I am working on it.


Publish NodeClaim Resource Requests as Metrics in Karpenter

Description
What problem are you trying to solve?
Trying to understand the binpack overhead in the k8s cluster
How important is this feature to you?
Can be very useful in optimizing cluster cost
Example:  Below is a snippet from describe nodeclaim
Resources:
Requests:
Cpu:   15250m
Memory: 61540Mi
I want this as metric from karpenter. it can be something similar to "kube_pod_container_resourrce_requests"

Please vote on this issue by adding a 👍 reaction to the original issue to help the community and maintainers prioritize this request
Please do not leave "+1" or "me too" comments, they generate extra noise for issue followers and do not help prioritize the request
If you are interested in working on this issue or have submitted a pull request, please leave a comment

@njtran What do you think about this feature request? Please let me know


Update docker-compose.yml

Title
added .:/root/.spotdl so that the config.json will be easier to edit.
Description
the config.json file is stored under '/root/.spotdl' adding this to the docker-compose.yml file will make it easier for users to find and edit the config.json file when running on docker compose.
Related Issue
I've never contributed to a project before, if a change this small requires an issue to be made I can open one.
Motivation and Context
Make it easier for future docker compose users to find and edit 'config.json'
How Has This Been Tested?
tested on my homelab, using '.:/root/.spotdl' does indeed make 'config.json' appear in the root of the docker folder.
Screenshots (if appropriate)
Types of Changes

[  ] Bug fix (non-breaking change which fixes an issue)
[ x] New feature (non-breaking change which adds functionality)
[  ] Breaking change (fix or feature that would cause existing functionality to change)

Checklist

[ x] My code follows the code style of this project
[ ] My change requires a change to the documentation
[ ] I have updated the documentation accordingly
[x ] I have read the CONTRIBUTING document
[x ] I have read the  CORE VALUES document
[ ] I have added tests to cover my changes
[ ] All new and existing tests passed

sorry I'm still new to github. Looks like I'm intended to open an issue instead.


Fixed grammatical mistake

@Vaibhav11Sajnani : Thanks for your contribution! The author, @, has been notified to review your proposed change.


Favicon notification badge does not render correctly

I have some code laying around that implements this well, if you are interested I can submit a pull request for you to evaluate.

Yes thank you, I'd be very interested to see what you have @federicobond. The library I'm currently using is fairly old, but was the best one I could find at the time that didn't suffer from bad performance, and which (I thought anyway) rendered ok on all major browsers. Out of curiosity, what browser and platform are you using?

That's Firefox on MacOS Sonoma 14.1. I'll look for some time these days to put something together.

Thanks for the quick answer!

Thank you too. I realise that implementing a PR may be the most difficult thing for you, so even if you could point me in the direction of a better library that would be great (ie: I can implement it myself).

Sure, I put together a quick demo here: https://github.com/federicobond/badgicon
Feel free to copy and paste the code there and adapt it to your needs, I release every right to you.

Thank you for this, I will definitely have a good look when I get some time (next weekend as I am away for the next 5 days).
In the meantime, could you please explain to me what the advantage is of your library vs: Tinycon (the one Mailpit uses)? I also had a quick play in my browser and has to bump the font size from 28 to 38 to get it similar to Mailpit's one as 28 was just too small to read, so I am wondering if it is just a font selection issue (ie: you don't have Arial installed).

I have made a small change to the existing implementation to add a fallback font (sans-serif) to see if this helps your problem (I suspect you simply don't have Arial installed). This change has been released in v1.10.2.
Whilst I am still open to implementing your solution, I would like to know what the advantage is of your implementation vs: the tinyicon library I'm using before I do so, and in order to use yours (or a variation of yours) I would also require your project to have a valid LICENSE file in the repo (eg: something like this). Unfortunately just a comment in an issue stating one can use code does not legally make it open source ;-)

Still having the same problem
Mailpit Version: 1.10.2
Firefox Version: 120.0.1 (64-bit)
MacOS Version: 14.1.2 (23B92)

@parth391 Thanks for the feedback. Can you please open this and confirm whether the favicon appears as it should on the same platform/browser you tested previously? Thanks.

Hi, I can confirm the test link looks good in my computer too.

@axllent, v1.10.4 fix the issue on MacOS.
Thanks.


Turn all private to internal, all methods to virtual

As per title.

I have also checked if there is any big change in the deployment gas cost due to this change. The worst case is Voting with 24 gas of difference. ResolutionManager and ShareholderRegistry have absolutely no difference.

Out of curiosity, I had a look at the opcode generated for the different variations of public/internal/private virtual/non virtual using a dummy contract.
For variables, che most concise opcode comes with internal variables, followed by private and public (not a surprise, as it generates the getter function).  The difference between public and internal is noticeable. internal seems to have less ops than private.


Add foreign symbolId

Let's say I have SymbolA in LibraryA. Its Object id is "OID1" and Symbol Id is "SID1". I used this symbol as an override of SymbolB in LibraryB and saved the override value. SymbolA's Symbol ID became "SID2" when imported to LibraryB. So I saved "SID2" as override value. In my DocumentA I need to find and import that symbol which I only know its Symbol Id as "SID2". There is no convenient way to find SymbolA  as an importable for DocumentA. Importable references have only "Future Symbol Id"s. I can get the symbols object id (OID1) but it is useless. The only way to find it by searching with symbol name which may not be unique. Here you can see my example code.
const getValueForSymbolOverride = (doc, symbol, override) => {
  let master = doc.getSymbolMasterWithID(override.value)
  if (master) {
    return master.symbolId
  } else {
    let library = symbol.master.getLibrary()
    if (library) {
      let importable = library.getImportableSymbolReferencesForDocument(doc)
        .find(importable => importable.id == override.value)
      if (importable) {
        return importable.import().symbolId
      } else {
        master = library.getDocument().getSymbols()
          .find(master => master.symbolId == override.value)
        if (master) {
          if (master.getLibrary()) {
            importable = master.getLibrary()
              .getImportableSymbolReferencesForDocument(doc)
              .find(importable => importable.name == master.name)
          } else {
            importable = library.getImportableSymbolReferencesForDocument(doc)
              .find(importable => importable.name == master.name)
          }
          if (importable) {
            return importable.import().symbolId
          }
        }
      }
    }
  }
}

I'm using this code in my Symbol States plugin. It will be more stable if ImportableObjects have a constant object Id.
Thanks.

Ah I see. What you want is symbol.master.sketchObject.foreignObject().remoteShareID().
I'll see where to add it in the API, probably symbol.master.getSymbolIdInLibrary()

Thanks for quick response. I'm not sure that will work. I have to find them as importable to import into document without any problem. I had success to find the symbol with code below, but could not manage to find text or layer styles.
let importable = library.getImportableSymbolReferencesForDocument(doc)
        .find(importable => importable.sketchObject.symbolMaster().objectID() == override.value)

I think a constant objectID still necessary for importable references.

Then I really don't understand what you are trying to do.
But importable.sketchObject.symbolMaster().objectID() is just importable.id

The layer version of that code is like this:
const getValueForLayerStyleOverride = (doc, symbol, override) => {
  let id = getStyleID(override.value),
    layerStyle = doc.getSharedLayerStyleWithID(override.value) ||
    doc.getSharedLayerStyleWithID(id)
  if (layerStyle) {
    return layerStyle.id
  } else {
    let library = symbol.master.getLibrary()
    if (library) {
      let importable = library
        .getImportableLayerStyleReferencesForDocument(doc)
        .find(importable => importable.id.includes(id))
      if (importable) {
        return importable.import().id
      } else {
        layerStyle = library.getDocument().sharedLayerStyles
          .find(style => style.id.includes(id))
        if (layerStyle) {
          if (layerStyle.getLibrary()) {
            importable = layerStyle.getLibrary()
              .getImportableLayerStyleReferencesForDocument(doc)
              .find(importable => importable.name == layerStyle.name)
          } else {
            importable = library
              .getImportableLayerStyleReferencesForDocument(doc)
              .find(importable => importable.name == layerStyle.name)
          }
          if (importable) {
            return importable.import().id
          }
        }
      }
    }
  }
}

const getStyleID = value => {
  let matches = value.match(/\[(.*?)\]/)
  return (matches) ? matches[1] : value
}

It is not importable.id. importable.id is the id what symbol gets when imported. I need the original objectID in the library.

The working code is here. I think you read while when I editing it. (I wrote wrong at first)
importable = master.getLibrary().getImportableSymbolReferencesForDocument(doc)
    .find(importable => importable.sketchObject.symbolMaster().objectID() == master.id)

Here is the console log:
console.log("Master ID:     %o", master.id)
console.log("Importable ID: %o", importable.id)
console.log("Importable objectID: %o", importable.sketchObject.symbolMaster().objectID())

outputs
Master ID:     '077167B7-D316-4A1E-90D2-38718F13BFA2'
Importable ID: '3CF85883-1B93-4AE7-9BF2-8FEE67EF2FEC'
Importable objectID: '077167B7-D316-4A1E-90D2-38718F13BFA2'

master.getLibrary().getImportableSymbolReferencesForDocument(doc)
    .find(importable => importable.sketchObject.symbolMaster().objectID() == master.id)

is useless because importable.sketchObject.symbolMaster() will just be master. Why would you want to import it again?
To get the original symbolId of a symbol master coming from a library, you need symbol.master.sketchObject.foreignObject().remoteShareID(). So something like this:
const remoteSymbolId = master.sketchObject.foreignObject().remoteShareID()
const removeObjectId = master.library.getDocument().getSymbolMasterWithID(remoteSymbolId).id

There is no importable involved.

I'm not importing it again. I'm getting that master from a saved override value here:
master = library.getDocument().getSymbols()
    .find(master => master.symbolId == override.value)

then I'm trying to import it properly by Sketch API.

I'll to to explain situation again.
My plugin saves overrides values to symbol master. A form symbol for example:
I design a login form with empty state in LibraryB. The form fields come from LibraryA. Then, on an instance I override fields with error fields, and save that as a state. The error icons etc. still comes from LibraryA. At last, in my document, I present empty and error states of the form from LibraryB. I don't override it again and again for the error state, just loading saved state. So i get the override value (which is symbolId for LibraryB), look for that symbol in potential libraries, and import if found. The  Ids in importable references are unique for my document. There is no way to search importable references by neither LibraryBs symbolId (or objectID) nor LibraryAs symbolId (or objectId) The only way to find it as an importable reference is search it by name which may not be unique.
I hope it is more clear now.

Not really no.
I tried to rewrite your code, comment it and remove the indentation. Let me know if that's correct:
const getValueForSymbolOverride = (doc, symbol, override) => {
  const master = doc.getSymbolMasterWithID(override.value)
  if (master) {
    // the override references a local symbol, easy peasy
    return master.symbolId
  }

  const library = symbol.master.getLibrary()
  if (!library) {
    // the override references a symbol that is not local and our symbol doesn't
    // come from a library. Not good.
    // should probably throw here
    return undefined
  }

  let importable = library
    .getImportableSymbolReferencesForDocument(doc)
    .find(x => x.id == override.value)
  if (importable) {
    // the override references a importable symbol, all good
    return importable.import().symbolId
  }

  // now we have the case where the override reference the symbolID of the library
  // we can either look by name (doesn't work if multiple symbols have the same name)
  // or we can check the remoteShareID
  importable = library.getImportableSymbolReferencesForDocument(doc).find(
    x =>
      String(
        x.sketchObject
          .symbolMaster()
          .foreignObject()
          .remoteShareID()
      ) === override.value
  )

  if (!importable) {
    // well don't know what to do now
    // should probably throw here
    return undefined
  }

  return importable.import().symbolId
}

It's not working mate, you're looking to symbol masters library (LibraryB) only. Symbol is in LibraryB but some overrides are coming from LibraryA. We should look to LibraryA if not found in LibraryB and the problem just starts there!
Below part of my code is for that.
master = library.getDocument().getSymbols()
          .find(master => master.symbolId == override.value)
        if (master) {
          if (master.getLibrary()) {
            importable = master.getLibrary()
              .getImportableSymbolReferencesForDocument(doc)
              .find(importable => importable.name == master.name)

I'm sorry but your code is unreadable 🙈
So the override can reference a symbolID that is neither in the document nor the library of symbol?
Then you could use a recursive method:
const getValueForSymbolOverride = (doc, symbolMaster, override, initialDoc) => {
  if (!initialDoc) {
    // we only look for local symbols on the first recursion
    const master = doc.getSymbolMasterWithID(override.value)
    if (master) {
      // the override references a local symbol, easy peasy
      return master.symbolId
    }
  }

  const library = symbolMaster.getLibrary()
  if (!library) {
    // the override references a symbol that is not local and our symbol doesn't
    // come from a library. Not good.
    // should probably throw here
    return undefined
  }

  let importable = library
    .getImportableSymbolReferencesForDocument(initialDoc || doc)
    .find(x => x.id == override.value)
  if (importable) {
    // the override references a importable symbol, all good
    return importable.import().symbolId
  }

  // now we have the case where the override reference the symbolID of the library
  // we can either look by name (doesn't work if multiple symbols have the same name)
  // or we can check the remoteShareID
  importable = library
    .getImportableSymbolReferencesForDocument(initialDoc || doc)
    .find(
      x =>
        String(
          x.sketchObject
            .symbolMaster()
            .foreignObject()
            .remoteShareID()
        ) === override.value
    )

  if (importable) {
    // phew we did it
    return importable.import().symbolId
  }

  // now we need go up one level, and look for the library of the foreign Master
  const newDoc = library.getDocument()
  const foreignMaster = newDoc.getSymbolMasterWithID(override.value)
  if (!foreignMaster) {
    // not sure what to do here
    // should probably throw
    return undefined
  }
  return getValueForSymbolOverride(
    newDoc,
    foreignMaster,
    override,
    initialDoc || doc
  )
}

But given I still don't really understand what is going on...

But to answer your original question, an importable object is just a temporary object. It doesn't and won't have a constant object ID

I'm trying to explain my code, I hope it helps now.
const getValueForSymbolOverride = (doc, symbol, override) => {

  // look for override master in this document.
  let master = doc.getSymbolMasterWithID(override.value)

  // if master is in this document return symbolId.
  if (master) {
    return master.symbolId
  } else {

    // If override master not in this document then look in to
    // symbol masters library.
    let library = symbol.master.getLibrary()

    if (library) {
      let importable = library.getImportableSymbolReferencesForDocument(doc)
        .find(importable => importable.id == override.value)

      // If override master found in symbols library return symbolId.
      if (importable) {
        return importable.import().symbolId

      // If override master not found in symbol library too
      // lets try to get more info about it (id, name etc...)
      } else {
        master = library.getDocument().getSymbols()
          .find(master => master.symbolId == override.value)
        if (master) {

          // Ok we found local (imported) override master in symbols library.
          // We know its objectID and name and original library now.
          // Lets try to find it in its own library.
          if (master.getLibrary()) {

            // Here we can search by name only,
            // because importable references has no objectId
            // and reference.id is our future id and it is useless.
            importable = master.getLibrary()
              .getImportableSymbolReferencesForDocument(doc)
              .find(importable => importable.name == master.name)
          } else {
            importable = library.getImportableSymbolReferencesForDocument(doc)
              .find(importable => importable.name == master.name)
          }
          if (importable) {
            return importable.import().symbolId
          }
        }
      }
    }
  }
}

I understand its a temporary object. May be constant word is misused (English is not my native). I tried to mean that we need a unique id which not changing for every document (like symbols name).

by definition, an importable object is relative to a document. It can't be unique for every document because for some of them, it might not even make sense.

I appreciate for your effort but current issue title is irrelevant and not solving the problem. It should be something like "Expose objectID in Importable References". I'm closing the issue to avoid misleading. I will open a new issue with much better explanation later.
Thanks for everything again.


Manual approval required for workflow run<PHONE_NUMBER>

Workflow is pending manual review.
URL: https://github.com/pushpendrasingh3/manual-approval/actions/runs/8252428677
Required approvers: [pushpendrasingh3]
Respond "approved", "approve", "lgtm", "yes" to continue workflow or "denied", "deny", "no" to cancel.

approve

All approvers have approved, continuing workflow and closing this issue.


[CI] Add doc about trigger phrases

Signed-off-by: Zhecheng Li<EMAIL_ADDRESS>

Codecov Report

Merging #2570 (87e1730) into main (fe4457f) will decrease coverage by 17.59%.
The diff coverage is n/a.

@@             Coverage Diff             @@
##             main    #2570       +/-   ##
===========================================
- Coverage   60.09%   42.49%   -17.60%
===========================================
  Files         281      148      -133
  Lines       22243    18247     -3996
===========================================
- Hits        13366     7754     -5612
- Misses       7467     9797     +2330
+ Partials     1410      696      -714

Flag
Coverage Δ

kind-e2e-tests
?

unit-tests
42.49% <ø> (+<0.01%)
:arrow_up:

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

Impacted Files
Coverage Δ

pkg/ovs/openflow/default.go
0.00% <0.00%> (-100.00%)
:arrow_down:

pkg/util/runtime/runtime.go
0.00% <0.00%> (-100.00%)
:arrow_down:

pkg/agent/config/node_config.go
0.00% <0.00%> (-100.00%)
:arrow_down:

pkg/agent/cniserver/pod_configuration_linux.go
0.00% <0.00%> (-100.00%)
:arrow_down:

pkg/apis/controlplane/v1beta1/register.go
0.00% <0.00%> (-92.86%)
:arrow_down:

pkg/ovs/openflow/logs.go
9.52% <0.00%> (-90.48%)
:arrow_down:

pkg/apis/controlplane/register.go
0.00% <0.00%> (-90.00%)
:arrow_down:

pkg/agent/nodeportlocal/k8s/annotations.go
0.00% <0.00%> (-83.88%)
:arrow_down:

pkg/agent/agent_linux.go
0.00% <0.00%> (-80.00%)
:arrow_down:

pkg/agent/client.go
0.00% <0.00%> (-77.42%)
:arrow_down:

... and 229 more

/skip-all

/skip-all

/test-integration

/skip-all

@antoninbas all comments have been addressed and please help have another review.
/skip-all

/skip-all

@antoninbas the failed Windows UT is successful now.


Can't see the messages I send in a SLOW OFFLINER chat.

I am an offliner in a CCs chat and my messages are not sending/not showing up. I've tried everything. What can i do?

Please detail what "everything" is. See https://wiki.chatterino.com/Help/#why-are-my-messages-being-sent-in-webchat-but-not-in-chatterino and let us know of the results.

Please detail what "I've tried everything" is. See https://wiki.chatterino.com/Help/#why-are-my-messages-being-sent-in-webchat-but-not-in-chatterino and let us know of the results.

What I mean by that is that I read articles on how to resolve this issue but it didn't work for me. And first of all, thank you for the link, I've read through it. The chat is still empty, about 4 people are there.

Although you have closed this issue as I assume the issue has been resolved, if you are still on 2.3.2 feel free to update to the most recent nightly found here: https://github.com/Chatterino/chatterino2/releases/tag/nightly-build
As the most common variation of this issue was fixed in 8639f450f23d4b58a07623dd568a4cd7c1bf4e03


sdlog2: no new sessXXX folder on every arm

Previously, if no time was set, sdlog2 created a folder like sess001,
sess002 for every logfile. The logfiles would then always be named
log001.px4log and their numbering would not actually increase.
This is now fixed and a new folder is only created per boot.

Looks good!


test: add ethcall derive test for vec tuples

Motivation
add a test to ensure Vec<(u8, u8) is supported

Solution

PR Checklist

[ ] Added Tests
[ ] Added Documentation
[ ] Updated the changelog

this lgtm but unit test fails, can merge once conflict+ test pass

bump re: conflict / tests, or should we close? @mattsse

merged and fixed


added position to player

fixed so player has position :+1: :dancer:

Closing because the rate at which you write frames to the device can be much faster than the playback rate, so this approach is not reliable.