service.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // Copyright 2018 The go-ethereum Authors
  2. // This file is part of the go-ethereum library.
  3. //
  4. // The go-ethereum library is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // The go-ethereum library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU Lesser General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Lesser General Public License
  15. // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
  16. package simulation
  17. import (
  18. "github.com/ethereum/go-ethereum/node"
  19. "github.com/ethereum/go-ethereum/p2p/enode"
  20. "github.com/ethereum/go-ethereum/p2p/simulations/adapters"
  21. )
  22. // Service returns a single Service by name on a particular node
  23. // with provided id.
  24. func (s *Simulation) Service(name string, id enode.ID) node.Service {
  25. simNode, ok := s.Net.GetNode(id).Node.(*adapters.SimNode)
  26. if !ok {
  27. return nil
  28. }
  29. services := simNode.ServiceMap()
  30. if len(services) == 0 {
  31. return nil
  32. }
  33. return services[name]
  34. }
  35. // RandomService returns a single Service by name on a
  36. // randomly chosen node that is up.
  37. func (s *Simulation) RandomService(name string) node.Service {
  38. n := s.RandomUpNode()
  39. if n == nil {
  40. return nil
  41. }
  42. return n.Service(name)
  43. }
  44. // Services returns all services with a provided name
  45. // from nodes that are up.
  46. func (s *Simulation) Services(name string) (services map[enode.ID]node.Service) {
  47. nodes := s.Net.GetNodes()
  48. services = make(map[enode.ID]node.Service)
  49. for _, node := range nodes {
  50. if !node.Up {
  51. continue
  52. }
  53. simNode, ok := node.Node.(*adapters.SimNode)
  54. if !ok {
  55. continue
  56. }
  57. services[node.ID()] = simNode.Service(name)
  58. }
  59. return services
  60. }