ipn,cmd/tailscale/cli: support hierarchical MaskedPrefs (#10507)
Some fields if `ipn.Prefs` are structs. `ipn.MaskedPrefs` has a single level of boolean `*Set` flags, which doesn't map well to nested structs within `ipn.Prefs`. Change `MaskedPrefs` and `ApplyEdits` to support `FooSet` struct fields that map to a nested struct of `ipn.Prefs` like `AutoUpdates`. Each struct field in `MaskedPrefs` is just a bundle of more `Set` bool fields or other structs. This allows you to have a `Set` flag for any arbitrarily-nested field of `ipn.Prefs`. Also, make `ApplyEdits` match fields between `Prefs` and `MaskedPrefs` by name instead of order, to make it a bit less finicky. It's probably slower but `ipn.ApplyEdits` should not be in any hot path. As a result, `AutoUpdate.Check` and `AutoUpdate.Apply` fields don't clobber each other when set individually. Updates #16247 Signed-off-by: Andrew Lytvynov <awly@tailscale.com>
This commit is contained in:
@ -761,6 +761,42 @@ func TestMaskedPrefsPretty(t *testing.T) {
|
||||
},
|
||||
want: `MaskedPrefs{ExitNodeIP=100.102.104.105}`,
|
||||
},
|
||||
{
|
||||
m: &MaskedPrefs{
|
||||
Prefs: Prefs{
|
||||
AutoUpdate: AutoUpdatePrefs{Check: true, Apply: false},
|
||||
},
|
||||
AutoUpdateSet: AutoUpdatePrefsMask{CheckSet: true, ApplySet: false},
|
||||
},
|
||||
want: `MaskedPrefs{AutoUpdate={Check=true}}`,
|
||||
},
|
||||
{
|
||||
m: &MaskedPrefs{
|
||||
Prefs: Prefs{
|
||||
AutoUpdate: AutoUpdatePrefs{Check: true, Apply: true},
|
||||
},
|
||||
AutoUpdateSet: AutoUpdatePrefsMask{CheckSet: true, ApplySet: true},
|
||||
},
|
||||
want: `MaskedPrefs{AutoUpdate={Check=true Apply=true}}`,
|
||||
},
|
||||
{
|
||||
m: &MaskedPrefs{
|
||||
Prefs: Prefs{
|
||||
AutoUpdate: AutoUpdatePrefs{Check: true, Apply: false},
|
||||
},
|
||||
AutoUpdateSet: AutoUpdatePrefsMask{CheckSet: false, ApplySet: true},
|
||||
},
|
||||
want: `MaskedPrefs{AutoUpdate={Apply=false}}`,
|
||||
},
|
||||
{
|
||||
m: &MaskedPrefs{
|
||||
Prefs: Prefs{
|
||||
AutoUpdate: AutoUpdatePrefs{Check: true, Apply: true},
|
||||
},
|
||||
AutoUpdateSet: AutoUpdatePrefsMask{CheckSet: false, ApplySet: false},
|
||||
},
|
||||
want: `MaskedPrefs{}`,
|
||||
},
|
||||
}
|
||||
for i, tt := range tests {
|
||||
got := tt.m.Pretty()
|
||||
|
Reference in New Issue
Block a user