github.com/erda-project/erda-infra@v1.0.9/providers/etcd-election/examples/main.go (about)

     1  // Copyright (c) 2021 Terminus, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package main
    16  
    17  import (
    18  	"context"
    19  	"os"
    20  	"time"
    21  
    22  	"github.com/erda-project/erda-infra/base/logs"
    23  	"github.com/erda-project/erda-infra/base/servicehub"
    24  	_ "github.com/erda-project/erda-infra/providers/etcd"
    25  	election "github.com/erda-project/erda-infra/providers/etcd-election"
    26  )
    27  
    28  type provider struct {
    29  	Log      logs.Logger
    30  	Election election.Interface `autowired:"etcd-election"`
    31  }
    32  
    33  func (p *provider) Init(ctx servicehub.Context) error {
    34  	p.Election.OnLeader(p.leaderTask)
    35  	return nil
    36  }
    37  
    38  func (p *provider) leaderTask(ctx context.Context) {
    39  	defer p.Log.Info("leader task exit")
    40  	watch := p.Election.Watch(ctx)
    41  	for {
    42  		select {
    43  		case event := <-watch:
    44  			p.Log.Infof("nodes changed: %v", event)
    45  		case <-time.After(3 * time.Second):
    46  			p.Log.Info("leader task doing")
    47  		case <-ctx.Done():
    48  			return
    49  		}
    50  	}
    51  }
    52  
    53  func (p *provider) Run(ctx context.Context) error {
    54  	select {
    55  	case <-time.After(10 * time.Second):
    56  		p.Log.Info("resign leader")
    57  		p.Election.ResignLeader()
    58  	case <-ctx.Done():
    59  	}
    60  	return nil
    61  }
    62  
    63  func init() {
    64  	servicehub.Register("example", &servicehub.Spec{
    65  		Services:     []string{"example"},
    66  		Dependencies: []string{"etcd"},
    67  		Description:  "example",
    68  		Creator: func() servicehub.Provider {
    69  			return &provider{}
    70  		},
    71  	})
    72  }
    73  
    74  func main() {
    75  	hub := servicehub.New()
    76  	hub.Run("examples", "", os.Args...)
    77  }
    78  
    79  // OUTPUT:
    80  // provider etcd config:
    81  // INFO[2021-06-23 17:13:26.894] provider etcd initialized
    82  // node id:  eff22718-a19c-4489-aa1c-b874f79c8b60
    83  // INFO[2021-06-23 17:13:26.894] provider etcd-election (depends services: [etcd etcd-client]) initialized
    84  // INFO[2021-06-23 17:13:26.894] provider example (depends services: [etcd etcd-election]) initialized
    85  // INFO[2021-06-23 17:13:26.895] signals to quit: [hangup interrupt terminated quit]
    86  // INFO[2021-06-23 17:13:26.900] provider example running ...
    87  // INFO[2021-06-23 17:13:26.902] provider etcd-election running ...
    88  // INFO[2021-06-23 17:13:29.124] I am leader ! node is "eff22718-a19c-4489-aa1c-b874f79c8b60"  module=etcd-election
    89  // INFO[2021-06-23 17:13:32.129] leader task doing                             module=example
    90  // INFO[2021-06-23 17:13:32.802] nodes changed: {delete {74ee6ac7-1703-43c6-bdc8-df90f9984d5b}}  module=example
    91  // INFO[2021-06-23 17:13:35.807] leader task doing                             module=example
    92  // INFO[2021-06-23 17:13:36.900] resign leader                                 module=example
    93  // INFO[2021-06-23 17:13:36.901] leader task exit                              module=example
    94  // INFO[2021-06-23 17:13:36.968] provider example exit
    95  // INFO[2021-06-23 17:13:42.798] I am leader ! node is "eff22718-a19c-4489-aa1c-b874f79c8b60"  module=etcd-election
    96  // INFO[2021-06-23 17:13:45.800] leader task doing                             module=example
    97  // INFO[2021-06-23 17:13:48.802] leader task doing                             module=example
    98  // INFO[2021-06-23 17:13:51.806] leader task doing                             module=example
    99  // INFO[2021-06-23 17:13:54.497] nodes changed: {delete {}}                    module=example
   100  // INFO[2021-06-23 17:13:57.502] leader task doing                             module=example
   101  // INFO[2021-06-23 17:14:00.506] leader task doing                             module=example
   102  // INFO[2021-06-23 17:14:03.510] leader task doing                             module=example