tailcfg: add Node.Capabilities, remove old stuff

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
pull/1641/head
Brad Fitzpatrick 4 years ago committed by Brad Fitzpatrick
parent c25ecddd1b
commit 2f60ab92dd

@ -4,7 +4,7 @@
package tailcfg package tailcfg
//go:generate go run tailscale.com/cmd/cloner --type=User,Node,Hostinfo,NetInfo,Group,Role,Capability,Login,DNSConfig,RegisterResponse --clonefunc=true --output=tailcfg_clone.go //go:generate go run tailscale.com/cmd/cloner --type=User,Node,Hostinfo,NetInfo,Login,DNSConfig,RegisterResponse --clonefunc=true --output=tailcfg_clone.go
import ( import (
"bytes" "bytes"
@ -66,20 +66,6 @@ func (u StableNodeID) IsZero() bool {
return u == "" return u == ""
} }
type GroupID ID
func (u GroupID) IsZero() bool {
return u == 0
}
type RoleID ID
func (u RoleID) IsZero() bool {
return u == 0
}
type CapabilityID ID
// MachineKey is the curve25519 public key for a machine. // MachineKey is the curve25519 public key for a machine.
type MachineKey [32]byte type MachineKey [32]byte
@ -90,31 +76,6 @@ type NodeKey [32]byte
// It's never written to disk or reused between network start-ups. // It's never written to disk or reused between network start-ups.
type DiscoKey [32]byte type DiscoKey [32]byte
type Group struct {
ID GroupID
Name string
Members []ID
}
type Role struct {
ID RoleID
Name string
Capabilities []CapabilityID
}
type CapType string
const (
CapRead = CapType("read")
CapWrite = CapType("write")
)
type Capability struct {
ID CapabilityID
Type CapType
Val ID
}
// User is an IPN user. // User is an IPN user.
// //
// A user can have multiple logins associated with it (e.g. gmail and github oauth). // A user can have multiple logins associated with it (e.g. gmail and github oauth).
@ -133,7 +94,6 @@ type User struct {
ProfilePicURL string // if non-empty overrides Login field ProfilePicURL string // if non-empty overrides Login field
Domain string Domain string
Logins []LoginID Logins []LoginID
Roles []RoleID
Created time.Time Created time.Time
} }
@ -200,6 +160,13 @@ type Node struct {
MachineAuthorized bool `json:",omitempty"` // TODO(crawshaw): replace with MachineStatus MachineAuthorized bool `json:",omitempty"` // TODO(crawshaw): replace with MachineStatus
// Capabilities are capabilities that the node has.
// They're free-form strings, but should be in the form of URLs/URIs
// such as:
// "https://tailscale.com/cap/is-admin"
// "https://tailscale.com/cap/recv-file"
Capabilities []string `json:",omitempty"`
// The following three computed fields hold the various names that can // The following three computed fields hold the various names that can
// be used for this node in UIs. They are populated from controlclient // be used for this node in UIs. They are populated from controlclient
// (not from control) by calling node.InitDisplayNames. These can be // (not from control) by calling node.InitDisplayNames. These can be
@ -904,10 +871,6 @@ type MapResponse struct {
PacketFilter []FilterRule PacketFilter []FilterRule
UserProfiles []UserProfile // as of 1.1.541 (mapver 5): may be new or updated user profiles only UserProfiles []UserProfile // as of 1.1.541 (mapver 5): may be new or updated user profiles only
Roles []Role // deprecated; clients should not rely on Roles
// TODO: Groups []Group
// TODO: Capabilities []Capability
// Debug is normally nil, except for when the control server // Debug is normally nil, except for when the control server
// is setting debug settings on a node. // is setting debug settings on a node.
@ -994,13 +957,10 @@ func (k DiscoKey) ShortString() string { return fmt.Sprintf("d:%x",
// IsZero reports whether k is the zero value. // IsZero reports whether k is the zero value.
func (k DiscoKey) IsZero() bool { return k == DiscoKey{} } func (k DiscoKey) IsZero() bool { return k == DiscoKey{} }
func (id ID) String() string { return fmt.Sprintf("id:%x", int64(id)) } func (id ID) String() string { return fmt.Sprintf("id:%x", int64(id)) }
func (id UserID) String() string { return fmt.Sprintf("userid:%x", int64(id)) } func (id UserID) String() string { return fmt.Sprintf("userid:%x", int64(id)) }
func (id LoginID) String() string { return fmt.Sprintf("loginid:%x", int64(id)) } func (id LoginID) String() string { return fmt.Sprintf("loginid:%x", int64(id)) }
func (id NodeID) String() string { return fmt.Sprintf("nodeid:%x", int64(id)) } func (id NodeID) String() string { return fmt.Sprintf("nodeid:%x", int64(id)) }
func (id GroupID) String() string { return fmt.Sprintf("groupid:%x", int64(id)) }
func (id RoleID) String() string { return fmt.Sprintf("roleid:%x", int64(id)) }
func (id CapabilityID) String() string { return fmt.Sprintf("capid:%x", int64(id)) }
// Equal reports whether n and n2 are equal. // Equal reports whether n and n2 are equal.
func (n *Node) Equal(n2 *Node) bool { func (n *Node) Equal(n2 *Node) bool {
@ -1025,6 +985,7 @@ func (n *Node) Equal(n2 *Node) bool {
n.Created.Equal(n2.Created) && n.Created.Equal(n2.Created) &&
eqTimePtr(n.LastSeen, n2.LastSeen) && eqTimePtr(n.LastSeen, n2.LastSeen) &&
n.MachineAuthorized == n2.MachineAuthorized && n.MachineAuthorized == n2.MachineAuthorized &&
eqStrings(n.Capabilities, n2.Capabilities) &&
n.ComputedName == n2.ComputedName && n.ComputedName == n2.ComputedName &&
n.computedHostIfDifferent == n2.computedHostIfDifferent && n.computedHostIfDifferent == n2.computedHostIfDifferent &&
n.ComputedNameWithHost == n2.ComputedNameWithHost n.ComputedNameWithHost == n2.ComputedNameWithHost

@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// Code generated by tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Group,Role,Capability,Login,DNSConfig,RegisterResponse; DO NOT EDIT. // Code generated by tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Login,DNSConfig,RegisterResponse; DO NOT EDIT.
package tailcfg package tailcfg
@ -22,12 +22,11 @@ func (src *User) Clone() *User {
dst := new(User) dst := new(User)
*dst = *src *dst = *src
dst.Logins = append(src.Logins[:0:0], src.Logins...) dst.Logins = append(src.Logins[:0:0], src.Logins...)
dst.Roles = append(src.Roles[:0:0], src.Roles...)
return dst return dst
} }
// A compilation failure here means this code must be regenerated, with command: // A compilation failure here means this code must be regenerated, with command:
// tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Group,Role,Capability,Login,DNSConfig,RegisterResponse // tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Login,DNSConfig,RegisterResponse
var _UserNeedsRegeneration = User(struct { var _UserNeedsRegeneration = User(struct {
ID UserID ID UserID
LoginName string LoginName string
@ -35,7 +34,6 @@ var _UserNeedsRegeneration = User(struct {
ProfilePicURL string ProfilePicURL string
Domain string Domain string
Logins []LoginID Logins []LoginID
Roles []RoleID
Created time.Time Created time.Time
}{}) }{})
@ -55,11 +53,12 @@ func (src *Node) Clone() *Node {
dst.LastSeen = new(time.Time) dst.LastSeen = new(time.Time)
*dst.LastSeen = *src.LastSeen *dst.LastSeen = *src.LastSeen
} }
dst.Capabilities = append(src.Capabilities[:0:0], src.Capabilities...)
return dst return dst
} }
// A compilation failure here means this code must be regenerated, with command: // A compilation failure here means this code must be regenerated, with command:
// tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Group,Role,Capability,Login,DNSConfig,RegisterResponse // tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Login,DNSConfig,RegisterResponse
var _NodeNeedsRegeneration = Node(struct { var _NodeNeedsRegeneration = Node(struct {
ID NodeID ID NodeID
StableID StableNodeID StableID StableNodeID
@ -79,6 +78,7 @@ var _NodeNeedsRegeneration = Node(struct {
LastSeen *time.Time LastSeen *time.Time
KeepAlive bool KeepAlive bool
MachineAuthorized bool MachineAuthorized bool
Capabilities []string
ComputedName string ComputedName string
computedHostIfDifferent string computedHostIfDifferent string
ComputedNameWithHost string ComputedNameWithHost string
@ -100,7 +100,7 @@ func (src *Hostinfo) Clone() *Hostinfo {
} }
// A compilation failure here means this code must be regenerated, with command: // A compilation failure here means this code must be regenerated, with command:
// tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Group,Role,Capability,Login,DNSConfig,RegisterResponse // tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Login,DNSConfig,RegisterResponse
var _HostinfoNeedsRegeneration = Hostinfo(struct { var _HostinfoNeedsRegeneration = Hostinfo(struct {
IPNVersion string IPNVersion string
FrontendLogID string FrontendLogID string
@ -137,7 +137,7 @@ func (src *NetInfo) Clone() *NetInfo {
} }
// A compilation failure here means this code must be regenerated, with command: // A compilation failure here means this code must be regenerated, with command:
// tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Group,Role,Capability,Login,DNSConfig,RegisterResponse // tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Login,DNSConfig,RegisterResponse
var _NetInfoNeedsRegeneration = NetInfo(struct { var _NetInfoNeedsRegeneration = NetInfo(struct {
MappingVariesByDestIP opt.Bool MappingVariesByDestIP opt.Bool
HairPinning opt.Bool HairPinning opt.Bool
@ -152,65 +152,6 @@ var _NetInfoNeedsRegeneration = NetInfo(struct {
DERPLatency map[string]float64 DERPLatency map[string]float64
}{}) }{})
// Clone makes a deep copy of Group.
// The result aliases no memory with the original.
func (src *Group) Clone() *Group {
if src == nil {
return nil
}
dst := new(Group)
*dst = *src
dst.Members = append(src.Members[:0:0], src.Members...)
return dst
}
// A compilation failure here means this code must be regenerated, with command:
// tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Group,Role,Capability,Login,DNSConfig,RegisterResponse
var _GroupNeedsRegeneration = Group(struct {
ID GroupID
Name string
Members []ID
}{})
// Clone makes a deep copy of Role.
// The result aliases no memory with the original.
func (src *Role) Clone() *Role {
if src == nil {
return nil
}
dst := new(Role)
*dst = *src
dst.Capabilities = append(src.Capabilities[:0:0], src.Capabilities...)
return dst
}
// A compilation failure here means this code must be regenerated, with command:
// tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Group,Role,Capability,Login,DNSConfig,RegisterResponse
var _RoleNeedsRegeneration = Role(struct {
ID RoleID
Name string
Capabilities []CapabilityID
}{})
// Clone makes a deep copy of Capability.
// The result aliases no memory with the original.
func (src *Capability) Clone() *Capability {
if src == nil {
return nil
}
dst := new(Capability)
*dst = *src
return dst
}
// A compilation failure here means this code must be regenerated, with command:
// tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Group,Role,Capability,Login,DNSConfig,RegisterResponse
var _CapabilityNeedsRegeneration = Capability(struct {
ID CapabilityID
Type CapType
Val ID
}{})
// Clone makes a deep copy of Login. // Clone makes a deep copy of Login.
// The result aliases no memory with the original. // The result aliases no memory with the original.
func (src *Login) Clone() *Login { func (src *Login) Clone() *Login {
@ -223,7 +164,7 @@ func (src *Login) Clone() *Login {
} }
// A compilation failure here means this code must be regenerated, with command: // A compilation failure here means this code must be regenerated, with command:
// tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Group,Role,Capability,Login,DNSConfig,RegisterResponse // tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Login,DNSConfig,RegisterResponse
var _LoginNeedsRegeneration = Login(struct { var _LoginNeedsRegeneration = Login(struct {
_ structs.Incomparable _ structs.Incomparable
ID LoginID ID LoginID
@ -248,7 +189,7 @@ func (src *DNSConfig) Clone() *DNSConfig {
} }
// A compilation failure here means this code must be regenerated, with command: // A compilation failure here means this code must be regenerated, with command:
// tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Group,Role,Capability,Login,DNSConfig,RegisterResponse // tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Login,DNSConfig,RegisterResponse
var _DNSConfigNeedsRegeneration = DNSConfig(struct { var _DNSConfigNeedsRegeneration = DNSConfig(struct {
Nameservers []netaddr.IP Nameservers []netaddr.IP
Domains []string Domains []string
@ -269,7 +210,7 @@ func (src *RegisterResponse) Clone() *RegisterResponse {
} }
// A compilation failure here means this code must be regenerated, with command: // A compilation failure here means this code must be regenerated, with command:
// tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Group,Role,Capability,Login,DNSConfig,RegisterResponse // tailscale.com/cmd/cloner -type User,Node,Hostinfo,NetInfo,Login,DNSConfig,RegisterResponse
var _RegisterResponseNeedsRegeneration = RegisterResponse(struct { var _RegisterResponseNeedsRegeneration = RegisterResponse(struct {
User User User User
Login Login Login Login
@ -280,7 +221,7 @@ var _RegisterResponseNeedsRegeneration = RegisterResponse(struct {
// Clone duplicates src into dst and reports whether it succeeded. // Clone duplicates src into dst and reports whether it succeeded.
// To succeed, <src, dst> must be of types <*T, *T> or <*T, **T>, // To succeed, <src, dst> must be of types <*T, *T> or <*T, **T>,
// where T is one of User,Node,Hostinfo,NetInfo,Group,Role,Capability,Login,DNSConfig,RegisterResponse. // where T is one of User,Node,Hostinfo,NetInfo,Login,DNSConfig,RegisterResponse.
func Clone(dst, src interface{}) bool { func Clone(dst, src interface{}) bool {
switch src := src.(type) { switch src := src.(type) {
case *User: case *User:
@ -319,33 +260,6 @@ func Clone(dst, src interface{}) bool {
*dst = src.Clone() *dst = src.Clone()
return true return true
} }
case *Group:
switch dst := dst.(type) {
case *Group:
*dst = *src.Clone()
return true
case **Group:
*dst = src.Clone()
return true
}
case *Role:
switch dst := dst.(type) {
case *Role:
*dst = *src.Clone()
return true
case **Role:
*dst = src.Clone()
return true
}
case *Capability:
switch dst := dst.(type) {
case *Capability:
*dst = *src.Clone()
return true
case **Capability:
*dst = src.Clone()
return true
}
case *Login: case *Login:
switch dst := dst.(type) { switch dst := dst.(type) {
case *Login: case *Login:

@ -194,6 +194,7 @@ func TestNodeEqual(t *testing.T) {
"Key", "KeyExpiry", "Machine", "DiscoKey", "Key", "KeyExpiry", "Machine", "DiscoKey",
"Addresses", "AllowedIPs", "Endpoints", "DERP", "Hostinfo", "Addresses", "AllowedIPs", "Endpoints", "DERP", "Hostinfo",
"Created", "LastSeen", "KeepAlive", "MachineAuthorized", "Created", "LastSeen", "KeepAlive", "MachineAuthorized",
"Capabilities",
"ComputedName", "computedHostIfDifferent", "ComputedNameWithHost", "ComputedName", "computedHostIfDifferent", "ComputedNameWithHost",
} }
if have := fieldsOf(reflect.TypeOf(Node{})); !reflect.DeepEqual(have, nodeHandles) { if have := fieldsOf(reflect.TypeOf(Node{})); !reflect.DeepEqual(have, nodeHandles) {

Loading…
Cancel
Save