Skip to content

Commit

Permalink
Return antrea-cluster-identity creation time in identity provider (#1942
Browse files Browse the repository at this point in the history
)

This creation time can be considered as the time at which Antrea was
deployed to the cluster.
  • Loading branch information
antoninbas authored Mar 10, 2021
1 parent b36103a commit d77f8ff
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 24 deletions.
4 changes: 2 additions & 2 deletions cmd/flow-aggregator/flow-aggregator.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,10 @@ func genObservationDomainID(k8sClient kubernetes.Interface) uint32 {
)
var clusterUUID uuid.UUID
if err := wait.PollImmediate(retryInterval, timeout, func() (bool, error) {
var err error
if clusterUUID, err = clusterIdentityProvider.Get(); err != nil {
if clusterIdentity, _, err := clusterIdentityProvider.Get(); err != nil {
return false, nil
} else {
clusterUUID = clusterIdentity.UUID
return true, nil
}
}); err != nil {
Expand Down
34 changes: 25 additions & 9 deletions pkg/clusteridentity/clusteridentity.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,10 +125,16 @@ func (a *ClusterIdentityAllocator) Run(stopCh <-chan struct{}) {
}
}

type ClusterIdentity struct {
UUID uuid.UUID
}

// ClusterIdentityProvider is an interface used to retrieve the cluster identity information (UUID),
// as provided by the user or generated by the Antrea Controller.
// as provided by the user or generated by the Antrea Controller. It also returns the time at which
// the antrea-cluster-identity was created, which can typically be considered as the time at which
// Antrea was deployed to the cluster.
type ClusterIdentityProvider interface {
Get() (uuid.UUID, error)
Get() (ClusterIdentity, time.Time, error)
}

type clusterIdentityProvider struct {
Expand All @@ -153,23 +159,33 @@ func NewClusterIdentityProvider(

// Get will retrieve the cluster identity (UUID) stored in the antrea-cluster-identity ConfigMap. In
// case of error, clients are invited to retry as the information may not be available yet.
func (p *clusterIdentityProvider) Get() (uuid.UUID, error) {
func (p *clusterIdentityProvider) Get() (ClusterIdentity, time.Time, error) {
var identity ClusterIdentity
var creationTime time.Time

configMap, err := p.k8sClient.CoreV1().ConfigMaps(p.clusterIdentityConfigMapNamespace).Get(context.TODO(), p.clusterIdentityConfigMapName, metav1.GetOptions{})
if err != nil {
return uuid.Nil, fmt.Errorf("error when getting '%s/%s' ConfigMap: %v", p.clusterIdentityConfigMapNamespace, p.clusterIdentityConfigMapName, err)
return identity, creationTime, fmt.Errorf("error when getting '%s/%s' ConfigMap: %v", p.clusterIdentityConfigMapNamespace, p.clusterIdentityConfigMapName, err)
}

getUUID := func() (uuid.UUID, error) {
creationTime = configMap.CreationTimestamp.Time

getUUID := func() error {
clusterUUIDStr, ok := configMap.Data[uuidConfigMapKey]
if !ok || clusterUUIDStr == "" {
return uuid.Nil, fmt.Errorf("cluster UUID has not been set yet")
return fmt.Errorf("cluster UUID has not been set yet")
}
clusterUUID, err := uuid.Parse(clusterUUIDStr)
if err != nil {
return uuid.Nil, fmt.Errorf("cluster UUID cannot be parsed")
return fmt.Errorf("cluster UUID cannot be parsed")
}
return clusterUUID, nil
identity.UUID = clusterUUID
return nil
}

if err := getUUID(); err != nil {
return identity, creationTime, err
}

return getUUID()
return identity, creationTime, nil
}
35 changes: 24 additions & 11 deletions pkg/clusteridentity/clusteridentity_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,15 @@ const (
var (
clusterUUID = uuid.New()

// First release of Antrea (v0.1.0) at KubeCon NA 2019 (San Diego) :)
sanDiegoLocation, _ = time.LoadLocation("America/Los_Angeles")
configMapCreationTimestamp = metav1.Date(2019, time.November, 18, 11, 26, 2, 0, sanDiegoLocation)

idConfigMap = &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Namespace: antreaNamespace,
Name: DefaultClusterIdentityConfigMapName,
Namespace: antreaNamespace,
Name: DefaultClusterIdentityConfigMapName,
CreationTimestamp: configMapCreationTimestamp,
},
Data: map[string]string{
uuidConfigMapKey: clusterUUID.String(),
Expand All @@ -47,8 +52,9 @@ var (

idConfigMapEmpty = &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Namespace: antreaNamespace,
Name: DefaultClusterIdentityConfigMapName,
Namespace: antreaNamespace,
Name: DefaultClusterIdentityConfigMapName,
CreationTimestamp: configMapCreationTimestamp,
},
Data: map[string]string{},
}
Expand All @@ -60,9 +66,12 @@ func TestClusterIdentityAllocatorNew(t *testing.T) {
require.NoError(t, allocator.updateConfigMapIfNeeded())

provider := NewClusterIdentityProvider(antreaNamespace, DefaultClusterIdentityConfigMapName, client)
actualUUID, err := provider.Get()
identity, creationTime, err := provider.Get()
require.NoError(t, err, "Error when retrieving cluster identity")
assert.NotEqual(t, uuid.Nil, actualUUID)
assert.NotEqual(t, uuid.Nil, identity.UUID)
// comparing timestamps directly does not work because of different location pointers

assert.True(t, creationTime.Equal(configMapCreationTimestamp.Time))
}

func TestClusterIdentityAllocatorExisting(t *testing.T) {
Expand All @@ -71,15 +80,17 @@ func TestClusterIdentityAllocatorExisting(t *testing.T) {
require.NoError(t, allocator.updateConfigMapIfNeeded())

provider := NewClusterIdentityProvider(antreaNamespace, DefaultClusterIdentityConfigMapName, client)
actualUUID, err := provider.Get()
identity, creationTime, err := provider.Get()
require.NoError(t, err, "Error when retrieving cluster identity")
assert.Equal(t, clusterUUID, actualUUID)
assert.Equal(t, clusterUUID, identity.UUID)

assert.True(t, creationTime.Equal(configMapCreationTimestamp.Time))
}

func TestClusterIdentityProviderMissingConfigMap(t *testing.T) {
client := fake.NewSimpleClientset()
provider := NewClusterIdentityProvider(antreaNamespace, DefaultClusterIdentityConfigMapName, client)
_, err := provider.Get()
_, _, err := provider.Get()
assert.Error(t, err, "Cluster identity should not be available")
}

Expand Down Expand Up @@ -107,7 +118,9 @@ func TestClusterIdentityAllocatorRun(t *testing.T) {
require.NoError(t, runWrapper(ctx, allocator), "Cluster identity could not be updated")

provider := NewClusterIdentityProvider(antreaNamespace, DefaultClusterIdentityConfigMapName, client)
actualUUID, err := provider.Get()
identity, creationTime, err := provider.Get()
require.NoError(t, err, "Error when retrieving cluster identity")
assert.NotEqual(t, uuid.Nil, actualUUID)
assert.NotEqual(t, uuid.Nil, identity.UUID)

assert.True(t, creationTime.Equal(configMapCreationTimestamp.Time))
}
4 changes: 2 additions & 2 deletions test/e2e/basic_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -756,10 +756,10 @@ func TestClusterIdentity(t *testing.T) {
const timeout = 10 * time.Second
var clusterUUID uuid.UUID
err = wait.PollImmediate(retryInterval, timeout, func() (bool, error) {
var err error
if clusterUUID, err = clusterIdentityProvider.Get(); err != nil {
if clusterIdentity, _, err := clusterIdentityProvider.Get(); err != nil {
return false, nil
} else {
clusterUUID = clusterIdentity.UUID
t.Logf("Cluster UUID: %v", clusterUUID)
return true, nil
}
Expand Down

0 comments on commit d77f8ff

Please sign in to comment.