talos/pkg/resources/network/nethelpers/address_flags.go
Andrey Smirnov db9c35b570 feat: implement AddressStatusController
This controller queries addresses of all the interfaces in the system
and presents them as resources. The idea is that can be a source for
many decisions - e.g. whether network is ready (physical interface has
scope global address assigned).

This is also good for debugging purposes.

Examples:

```
$ talosctl -n 172.20.0.2 get addresses
NODE         NAMESPACE   TYPE            ID                                          VERSION
172.20.0.2   network     AddressStatus   cni0/10.244.0.1/24                          1
172.20.0.2   network     AddressStatus   cni0/fe80::9c87:cdff:fe8e:5fdc/64           2
172.20.0.2   network     AddressStatus   eth0/172.20.0.2/24                          1
172.20.0.2   network     AddressStatus   eth0/fe80::ac1b:9cff:fe19:6b47/64           2
172.20.0.2   network     AddressStatus   flannel.1/10.244.0.0/32                     1
172.20.0.2   network     AddressStatus   flannel.1/fe80::440b:67ff:fe99:c18f/64      2
172.20.0.2   network     AddressStatus   lo/127.0.0.1/8                              1
172.20.0.2   network     AddressStatus   lo/::1/128                                  1
172.20.0.2   network     AddressStatus   veth178e9b31/fe80::6040:1dff:fe5b:ae1a/64   2
172.20.0.2   network     AddressStatus   vethb0b96a94/fe80::2473:86ff:fece:1954/64   2
```

```
$ talosctl -n 172.20.0.2 get addresses -o yaml eth0/172.20.0.2/24
node: 172.20.0.2
metadata:
    namespace: network
    type: AddressStatuses.net.talos.dev
    id: eth0/172.20.0.2/24
    version: 1
    owner: network.AddressStatusController
    phase: running
spec:
    address: 172.20.0.2/24
    local: 172.20.0.2
    broadcast: 172.20.0.255
    linkIndex: 4
    linkName: eth0
    family: inet4
    scope: global
    flags: permanent
```

Signed-off-by: Andrey Smirnov <smirnov.andrey@gmail.com>
2021-05-11 13:32:17 -07:00

53 lines
1.8 KiB
Go

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package nethelpers
//go:generate stringer -type=AddressFlag -linecomment
import (
"strings"
"golang.org/x/sys/unix"
)
// AddressFlags is a bitmask of AddressFlag.
type AddressFlags uint32
func (flags AddressFlags) String() string {
var values []string
for flag := AddressTemporary; flag <= AddressStablePrivacy; flag <<= 1 {
if (AddressFlag(flags) & flag) == flag {
values = append(values, flag.String())
}
}
return strings.Join(values, ",")
}
// MarshalYAML implements yaml.Marshaler.
func (flags AddressFlags) MarshalYAML() (interface{}, error) {
return flags.String(), nil
}
// AddressFlag wraps IFF_* constants.
type AddressFlag uint32
// AddressFlag constants.
const (
AddressTemporary AddressFlag = unix.IFA_F_TEMPORARY // temporary
AddressNoDAD AddressFlag = unix.IFA_F_NODAD // nodad
AddressOptimistic AddressFlag = unix.IFA_F_OPTIMISTIC // optimistic
AddressDADFailed AddressFlag = unix.IFA_F_DADFAILED // dadfailed
AddressHome AddressFlag = unix.IFA_F_HOMEADDRESS // homeaddress
AddressDeprecated AddressFlag = unix.IFA_F_DEPRECATED // deprecated
AddressTentative AddressFlag = unix.IFA_F_TENTATIVE // tentative
AddressPermanent AddressFlag = unix.IFA_F_PERMANENT // permanent
AddressManagementTemp AddressFlag = unix.IFA_F_MANAGETEMPADDR // mngmtmpaddr
AddressNoPrefixRoute AddressFlag = unix.IFA_F_NOPREFIXROUTE // noprefixroute
AddressMCAutoJoin AddressFlag = unix.IFA_F_MCAUTOJOIN // mcautojoin
AddressStablePrivacy AddressFlag = unix.IFA_F_STABLE_PRIVACY // stableprivacy
)