ops_switch.go raw

   1  // Copyright 2022-2025 The sacloud/iaas-api-go Authors
   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 fake
  16  
  17  import (
  18  	"context"
  19  	"fmt"
  20  
  21  	"github.com/sacloud/iaas-api-go"
  22  	"github.com/sacloud/iaas-api-go/types"
  23  )
  24  
  25  // Find is fake implementation
  26  func (o *SwitchOp) Find(ctx context.Context, zone string, conditions *iaas.FindCondition) (*iaas.SwitchFindResult, error) {
  27  	results, _ := find(o.key, zone, conditions)
  28  	var values []*iaas.Switch
  29  	for _, res := range results {
  30  		dest := &iaas.Switch{}
  31  		copySameNameField(res, dest)
  32  		values = append(values, dest)
  33  	}
  34  	return &iaas.SwitchFindResult{
  35  		Total:    len(results),
  36  		Count:    len(results),
  37  		From:     0,
  38  		Switches: values,
  39  	}, nil
  40  }
  41  
  42  // Create is fake implementation
  43  func (o *SwitchOp) Create(ctx context.Context, zone string, param *iaas.SwitchCreateRequest) (*iaas.Switch, error) {
  44  	result := &iaas.Switch{}
  45  	copySameNameField(param, result)
  46  	fill(result, fillID, fillCreatedAt, fillAvailability, fillScope)
  47  	result.Scope = types.Scopes.User
  48  	putSwitch(zone, result)
  49  	return result, nil
  50  }
  51  
  52  // Read is fake implementation
  53  func (o *SwitchOp) Read(ctx context.Context, zone string, id types.ID) (*iaas.Switch, error) {
  54  	value := getSwitchByID(zone, id)
  55  	if value == nil {
  56  		return nil, newErrorNotFound(o.key, id)
  57  	}
  58  	dest := &iaas.Switch{}
  59  	copySameNameField(value, dest)
  60  	return dest, nil
  61  }
  62  
  63  // Update is fake implementation
  64  func (o *SwitchOp) Update(ctx context.Context, zone string, id types.ID, param *iaas.SwitchUpdateRequest) (*iaas.Switch, error) {
  65  	value, err := o.Read(ctx, zone, id)
  66  	if err != nil {
  67  		return nil, err
  68  	}
  69  
  70  	copySameNameField(param, value)
  71  	fill(value, fillModifiedAt)
  72  
  73  	putSwitch(zone, value)
  74  	return value, nil
  75  }
  76  
  77  // Delete is fake implementation
  78  func (o *SwitchOp) Delete(ctx context.Context, zone string, id types.ID) error {
  79  	_, err := o.Read(ctx, zone, id)
  80  	if err != nil {
  81  		return err
  82  	}
  83  	ds().Delete(o.key, zone, id)
  84  	return nil
  85  }
  86  
  87  // ConnectToBridge is fake implementation
  88  func (o *SwitchOp) ConnectToBridge(ctx context.Context, zone string, id types.ID, bridgeID types.ID) error {
  89  	value, err := o.Read(ctx, zone, id)
  90  	if err != nil {
  91  		return err
  92  	}
  93  
  94  	bridgeOp := NewBridgeOp()
  95  	bridge, err := bridgeOp.Read(ctx, zone, bridgeID)
  96  	if err != nil {
  97  		return fmt.Errorf("ConnectToBridge is failed: %s", err)
  98  	}
  99  
 100  	if bridge.SwitchInZone != nil {
 101  		return newErrorConflict(o.key, id, fmt.Sprintf("Bridge[%d] already connected to switch", bridgeID))
 102  	}
 103  
 104  	value.BridgeID = bridgeID
 105  
 106  	switchInZone := &iaas.BridgeSwitchInfo{}
 107  	copySameNameField(value, switchInZone)
 108  	bridge.SwitchInZone = switchInZone
 109  
 110  	// bridge.BridgeInfo = append(bridge.BridgeInfo, &iaas.BridgeInfo{
 111  	//	ID:     value.ID,
 112  	//	Name:   value.Name,
 113  	//	ZoneID: zoneIDs[zone],
 114  	// })
 115  
 116  	putBridge(zone, bridge)
 117  	putSwitch(zone, value)
 118  	return nil
 119  }
 120  
 121  // DisconnectFromBridge is fake implementation
 122  func (o *SwitchOp) DisconnectFromBridge(ctx context.Context, zone string, id types.ID) error {
 123  	value, err := o.Read(ctx, zone, id)
 124  	if err != nil {
 125  		return err
 126  	}
 127  
 128  	if value.BridgeID.IsEmpty() {
 129  		return newErrorConflict(o.key, id, fmt.Sprintf("Switch[%d] already disconnected from switch", id))
 130  	}
 131  
 132  	bridgeOp := NewBridgeOp()
 133  	bridge, err := bridgeOp.Read(ctx, zone, value.BridgeID)
 134  	if err != nil {
 135  		return fmt.Errorf("DisconnectFromBridge is failed: %s", err)
 136  	}
 137  
 138  	// var bridgeInfo []*iaas.BridgeInfo
 139  	// for _, i := range bridge.BridgeInfo {
 140  	//	if i.ID != value.ID {
 141  	//		bridgeInfo = append(bridgeInfo, i)
 142  	//	}
 143  	// }
 144  
 145  	value.BridgeID = types.ID(0)
 146  	bridge.SwitchInZone = nil
 147  	// fakeドライバーではBridgeInfoに非対応
 148  	// bridge.BridgeInfo = bridgeInfo
 149  
 150  	putBridge(zone, bridge)
 151  	putSwitch(zone, value)
 152  	return nil
 153  }
 154  
 155  // GetServers is fake implementation
 156  func (o *SwitchOp) GetServers(ctx context.Context, zone string, id types.ID) (*iaas.SwitchGetServersResult, error) {
 157  	value, err := o.Read(ctx, zone, id)
 158  	if err != nil {
 159  		return nil, err
 160  	}
 161  	res := &iaas.SwitchGetServersResult{}
 162  	if value.ServerCount == 0 {
 163  		return res, nil
 164  	}
 165  
 166  	searched, err := NewServerOp().Find(ctx, zone, nil)
 167  	if err != nil {
 168  		return nil, err
 169  	}
 170  	for _, server := range searched.Servers {
 171  		for _, nic := range server.Interfaces {
 172  			if nic.SwitchID == id {
 173  				res.Servers = append(res.Servers, server)
 174  				res.Count++
 175  				res.Total++
 176  				break
 177  			}
 178  		}
 179  	}
 180  	return res, nil
 181  }
 182