fake.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. Copyright 2017 The Kubernetes Authors.
  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. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package testing
  14. import (
  15. "fmt"
  16. "k8s.io/apimachinery/pkg/util/sets"
  17. )
  18. // FakeNetlinkHandle mock implementation of proxy NetlinkHandle
  19. type FakeNetlinkHandle struct {
  20. // localAddresses is a network interface name to all of its IP addresses map, e.g.
  21. // eth0 -> [1.2.3.4, 10.20.30.40]
  22. localAddresses map[string][]string
  23. }
  24. // NewFakeNetlinkHandle will create a new FakeNetlinkHandle
  25. func NewFakeNetlinkHandle() *FakeNetlinkHandle {
  26. fake := &FakeNetlinkHandle{
  27. localAddresses: make(map[string][]string),
  28. }
  29. return fake
  30. }
  31. // EnsureAddressBind is a mock implementation
  32. func (h *FakeNetlinkHandle) EnsureAddressBind(address, devName string) (exist bool, err error) {
  33. if len(devName) == 0 {
  34. return false, fmt.Errorf("Device name can't be empty")
  35. }
  36. if _, ok := h.localAddresses[devName]; !ok {
  37. return false, fmt.Errorf("Error bind address: %s to a non-exist interface: %s", address, devName)
  38. }
  39. for _, addr := range h.localAddresses[devName] {
  40. if addr == address {
  41. // return true if the address is already bound to device
  42. return true, nil
  43. }
  44. }
  45. h.localAddresses[devName] = append(h.localAddresses[devName], address)
  46. return false, nil
  47. }
  48. // UnbindAddress is a mock implementation
  49. func (h *FakeNetlinkHandle) UnbindAddress(address, devName string) error {
  50. if len(devName) == 0 {
  51. return fmt.Errorf("Device name can't be empty")
  52. }
  53. if _, ok := h.localAddresses[devName]; !ok {
  54. return fmt.Errorf("Error unbind address: %s from a non-exist interface: %s", address, devName)
  55. }
  56. for i, addr := range h.localAddresses[devName] {
  57. if addr == address {
  58. // delete address from slice h.localAddresses[devName]
  59. h.localAddresses[devName] = append(h.localAddresses[devName][:i], h.localAddresses[devName][i+1:]...)
  60. return nil
  61. }
  62. }
  63. // return error message if address is not found in slice h.localAddresses[devName]
  64. return fmt.Errorf("Address: %s is not found in interface: %s", address, devName)
  65. }
  66. // EnsureDummyDevice is a mock implementation
  67. func (h *FakeNetlinkHandle) EnsureDummyDevice(devName string) (bool, error) {
  68. if len(devName) == 0 {
  69. return false, fmt.Errorf("Device name can't be empty")
  70. }
  71. if _, ok := h.localAddresses[devName]; !ok {
  72. // create dummy interface if devName is not found in localAddress map
  73. h.localAddresses[devName] = make([]string, 0)
  74. return false, nil
  75. }
  76. // return true if devName is already created in localAddress map
  77. return true, nil
  78. }
  79. // DeleteDummyDevice is a mock implementation
  80. func (h *FakeNetlinkHandle) DeleteDummyDevice(devName string) error {
  81. if len(devName) == 0 {
  82. return fmt.Errorf("Device name can't be empty")
  83. }
  84. if _, ok := h.localAddresses[devName]; !ok {
  85. return fmt.Errorf("Error deleting a non-exist interface: %s", devName)
  86. }
  87. delete(h.localAddresses, devName)
  88. return nil
  89. }
  90. // ListBindAddress is a mock implementation
  91. func (h *FakeNetlinkHandle) ListBindAddress(devName string) ([]string, error) {
  92. if len(devName) == 0 {
  93. return nil, fmt.Errorf("Device name can't be empty")
  94. }
  95. if _, ok := h.localAddresses[devName]; !ok {
  96. return nil, fmt.Errorf("Error list addresses from a non-exist interface: %s", devName)
  97. }
  98. return h.localAddresses[devName], nil
  99. }
  100. // GetLocalAddresses is a mock implementation
  101. func (h *FakeNetlinkHandle) GetLocalAddresses(dev, filterDev string) (sets.String, error) {
  102. res := sets.NewString()
  103. if len(dev) != 0 {
  104. // list all addresses from a given network interface.
  105. for _, addr := range h.localAddresses[dev] {
  106. res.Insert(addr)
  107. }
  108. return res, nil
  109. }
  110. // If filterDev is not given, will list all addresses from all available network interface.
  111. for linkName := range h.localAddresses {
  112. if linkName == filterDev {
  113. continue
  114. }
  115. // list all addresses from a given network interface.
  116. for _, addr := range h.localAddresses[linkName] {
  117. res.Insert(addr)
  118. }
  119. }
  120. return res, nil
  121. }
  122. // SetLocalAddresses set IP addresses to the given interface device. It's not part of interface.
  123. func (h *FakeNetlinkHandle) SetLocalAddresses(dev string, ips ...string) error {
  124. if h.localAddresses == nil {
  125. h.localAddresses = make(map[string][]string)
  126. }
  127. if len(dev) == 0 {
  128. return fmt.Errorf("device name can't be empty")
  129. }
  130. h.localAddresses[dev] = make([]string, 0)
  131. h.localAddresses[dev] = append(h.localAddresses[dev], ips...)
  132. return nil
  133. }