7.3 Site Migration Procedures¶
7.3.1 Site Classification and Migration Approach¶
Site Classification Matrix¶
site_classification:
hub_sites:
characteristics:
- "Multiple WAN Edge devices (HA)"
- "High bandwidth requirements (500 Mbps+)"
- "SD-Access fabric integration"
- "Data center services"
- "Regional aggregation point"
sites:
- site: "Mumbai"
type: "Primary Hub"
complexity: "Very High"
migration_window: "12 hours"
- site: "Chennai"
type: "Secondary Hub"
complexity: "High"
migration_window: "8 hours"
- site: "London"
type: "Regional Hub"
complexity: "High"
migration_window: "6 hours"
- site: "New Jersey"
type: "Regional Hub"
complexity: "High"
migration_window: "6 hours"
branch_sites:
characteristics:
- "Single or dual WAN Edge"
- "Standard bandwidth (100-200 Mbps)"
- "No fabric integration"
- "End-user focused"
sites:
- site: "Bangalore"
type: "Large Branch"
complexity: "Medium"
migration_window: "4 hours"
- site: "Delhi"
type: "Medium Branch"
complexity: "Low"
migration_window: "3 hours"
- site: "Noida"
type: "Medium Branch"
complexity: "Low"
migration_window: "3 hours"
- site: "Frankfurt"
type: "Medium Branch"
complexity: "Medium"
migration_window: "4 hours"
- site: "Dallas"
type: "Medium Branch"
complexity: "Medium"
migration_window: "4 hours"
Migration Approach by Site Type¶
migration_approaches:
greenfield:
description: "New site with no existing infrastructure"
approach:
- "Deploy WAN Edge directly"
- "No coexistence required"
- "Fastest migration"
typical_duration: "2-4 hours"
brownfield_parallel:
description: "Existing MPLS with parallel SD-WAN deployment"
approach:
- "Deploy SD-WAN alongside MPLS"
- "Validate before cutover"
- "Gradual traffic migration"
typical_duration: "4-8 hours"
sites: "All Abhavtech sites"
brownfield_replacement:
description: "Direct replacement of existing WAN equipment"
approach:
- "Remove old, install new"
- "Higher risk, faster execution"
- "Requires longer maintenance window"
typical_duration: "6-12 hours"
7.3.2 Standard Branch Migration Procedure¶
Pre-Migration Phase (T-7 Days to T-1 Day)¶
pre_migration_t_minus_7:
infrastructure_verification:
wan_edge_device:
- task: "Verify device staged and configured"
owner: "Network Engineer"
validation: |
- Device model matches plan
- IOS-XE version 17.15.x
- Bootstrap configuration loaded
circuits:
- task: "Verify internet circuit active"
owner: "Procurement/Network"
validation: |
- Provider confirms active
- Speed test matches SLA
- Static IP configured (if applicable)
- task: "Verify backup circuit ready"
owner: "Network Engineer"
validation: |
- LTE/5G SIM activated
- Signal strength adequate
- Data plan confirmed
controller_readiness:
- task: "Verify site configured in vManage"
owner: "Network Engineer"
validation: |
- Site ID assigned
- Templates attached
- Policies configured
pre_migration_t_minus_3:
notifications:
- task: "Send user notification"
owner: "Project Manager"
recipients: "Site users, Help Desk, NOC"
- task: "Confirm maintenance window"
owner: "Project Manager"
validation: "CAB approval documented"
technical_preparation:
- task: "Capture performance baseline"
owner: "Network Engineer"
measurements:
latency:
- "Site to Mumbai hub"
- "Site to Chennai hub"
- "Site to critical applications"
throughput:
- "Maximum bandwidth test"
- "Concurrent session test"
application:
- "SAP response time"
- "Email latency"
- "Voice MOS score"
pre_migration_t_minus_1:
final_checks:
- task: "Verify all prerequisites complete"
owner: "Technical Lead"
checklist: "pre_migration_checklist"
- task: "Confirm team availability"
owner: "Project Manager"
participants:
- "Network Engineer (on-site or remote)"
- "Site Contact (on-site)"
- "NOC (monitoring)"
- "On-call support"
- task: "Test rollback procedure"
owner: "Network Engineer"
validation: "Documented and understood"
Migration Execution Phase¶
migration_execution:
phase_1_preparation:
duration: "30 minutes"
step_1:
time: "T-30"
action: "Team assembly"
details:
- "Join bridge call"
- "Confirm all participants present"
- "Review migration plan"
step_2:
time: "T-15"
action: "Pre-flight checks"
commands: |
# Check current MPLS status
show interface summary
show ip route
# Verify no active incidents
# Check monitoring dashboards
step_3:
time: "T-0"
action: "Announce migration start"
notification: "NOC, stakeholders"
phase_2_deployment:
duration: "60-90 minutes"
step_4:
time: "T+5"
action: "Power on WAN Edge"
owner: "Site Contact"
validation: |
- Power LED on
- Boot sequence starts
- Console accessible
step_5:
time: "T+15"
action: "Verify bootstrap completion"
owner: "Network Engineer"
commands: |
show version
show sdwan running-config
show sdwan certificate installed
step_6:
time: "T+20"
action: "Verify control connections"
owner: "Network Engineer"
commands: |
show sdwan control connections
show sdwan control local-properties
expected_output: |
vManage: Connected
vSmart-1: Connected
vSmart-2: Connected
vBond: Discovered
step_7:
time: "T+30"
action: "Verify data plane"
owner: "Network Engineer"
commands: |
show sdwan bfd sessions
show sdwan omp routes
show sdwan omp tlocs
expected_output: |
- BFD sessions to hub sites UP
- OMP routes received from all sites
- Local TLOC advertised
step_8:
time: "T+45"
action: "Connect LAN interface"
owner: "Site Contact / Network Engineer"
steps:
- "Connect WAN Edge LAN port to switch"
- "Verify interface up"
- "Check VLAN trunking (if applicable)"
commands: |
show interface GigabitEthernet0/0/1
show ip interface brief
step_9:
time: "T+60"
action: "Verify LAN connectivity"
owner: "Network Engineer"
commands: |
show ip route vrf 10
ping vrf 10 [default-gateway]
ping vrf 10 [test-host]
phase_3_cutover:
duration: "30-45 minutes"
step_10:
time: "T+70"
action: "Initial traffic test"
owner: "Network Engineer"
tests:
- "Ping to hub sites"
- "Traceroute verification"
- "Basic application test"
step_11:
time: "T+80"
action: "Execute traffic cutover"
owner: "Network Engineer"
method: "Update routing/switching to prefer SD-WAN"
options:
option_a: "Adjust switch default gateway"
option_b: "Modify HSRP/VRRP priority"
option_c: "Update static routes"
step_12:
time: "T+90"
action: "Verify traffic flowing via SD-WAN"
owner: "Network Engineer"
commands: |
show sdwan app-route statistics
show interface counters rate
validation: "Traffic counters incrementing"
step_13:
time: "T+100"
action: "MPLS soft shutdown"
owner: "Network Engineer"
action_detail: "Administratively disable MPLS interface"
commands: |
interface GigabitEthernet0/0/0
shutdown
note: "Keep config for rollback"
phase_4_validation:
duration: "45-60 minutes"
step_14:
time: "T+110"
action: "Application validation"
owner: "Network Engineer / Site Contact"
tests:
sap:
- "Login test"
- "Transaction test"
- "Response time measurement"
email:
- "Send test email"
- "Receive test email"
- "Calendar sync"
voice:
- "Place test call"
- "Verify audio quality"
- "Check MOS score"
step_15:
time: "T+130"
action: "Performance validation"
owner: "Network Engineer"
comparison: "Against baseline captured T-1"
acceptance_criteria:
latency: "Within 10% of baseline"
packet_loss: "< 0.1%"
jitter: "< 30ms"
step_16:
time: "T+150"
action: "User validation"
owner: "Site Contact"
method: "Contact key users for confirmation"
step_17:
time: "T+165"
action: "Final monitoring check"
owner: "NOC"
validation:
- "No critical alarms"
- "All tunnels up"
- "Steady state traffic"
step_18:
time: "T+180"
action: "Declare migration complete"
owner: "Technical Lead"
announcement: "All stakeholders"
documentation: "Update migration tracker"
Post-Migration Phase¶
post_migration:
day_plus_1:
activities:
- time: "08:00"
task: "Morning health check"
owner: "Network Engineer"
- time: "09:00"
task: "Business hours validation"
owner: "NOC"
focus: "Monitor for user issues"
- time: "17:00"
task: "End of day review"
owner: "Network Engineer"
output: "Day 1 status report"
day_plus_3:
activities:
- task: "72-hour stability review"
owner: "Technical Lead"
metrics:
- "Uptime percentage"
- "Performance trends"
- "Issue count"
day_plus_7:
activities:
- task: "One-week review"
owner: "Project Manager"
deliverables:
- "Performance report"
- "Lessons learned"
- "Go/no-go for next site"
7.3.3 Hub Site Migration Procedure¶
Hub-Specific Considerations¶
hub_considerations:
high_availability:
requirement: "Dual WAN Edge with HA"
procedure: "Staged migration - Primary then Secondary"
failover_testing: "Required during migration"
sd_access_integration:
requirement: "Fabric border handoff"
procedure: "BGP peering after control plane stable"
validation: "Route exchange and SGT propagation"
branch_dependencies:
requirement: "Hub serves as transit for branches"
procedure: "Ensure branch connectivity maintained"
validation: "All branch sites reachable"
extended_window:
requirement: "Longer maintenance window"
duration: "6-12 hours depending on complexity"
timing: "Weekend preferred"
Hub Migration Detailed Steps¶
hub_migration_steps:
stage_1_primary_wan_edge:
duration: "2-3 hours"
steps:
- step: "Deploy Primary WAN Edge"
details:
- "Power on device"
- "Verify control connections"
- "Verify BFD tunnels"
- step: "Configure HA pairing"
commands: |
show redundancy
show vrrp brief
- step: "Verify OMP routes"
validation: "Routes from all sites received"
stage_2_secondary_wan_edge:
duration: "1-2 hours"
steps:
- step: "Deploy Secondary WAN Edge"
details:
- "Power on device"
- "Verify joins HA pair"
- step: "Verify HA status"
commands: |
show redundancy
expected: |
Primary: ACTIVE
Secondary: STANDBY HOT
- step: "Test failover"
action: "Simulate primary failure"
validation: "Traffic fails over < 3 seconds"
stage_3_fabric_integration:
duration: "1-2 hours"
condition: "Sites with SD-Access integration"
steps:
- step: "Enable BGP peering"
commands: |
# On WAN Edge
router bgp 65001
neighbor 10.10.1.2 remote-as 65100
neighbor 10.10.1.2 update-source GigabitEthernet0/0/1.101
address-family vpnv4 unicast
neighbor 10.10.1.2 activate
- step: "Verify BGP sessions"
commands: |
show bgp vpnv4 unicast all summary
expected: "State: Established"
- step: "Verify route exchange"
commands: |
show bgp vpnv4 unicast all
validation: "Fabric routes received"
- step: "Verify SGT propagation"
commands: |
show cts role-based sgt-map all
validation: "SGT mappings present"
stage_4_traffic_cutover:
duration: "1-2 hours"
steps:
- step: "Shift traffic to SD-WAN"
method: "BGP local preference adjustment"
- step: "Verify branch connectivity"
validation: "All branches can reach hub"
- step: "Disable MPLS interface"
action: "Administrative shutdown"
stage_5_validation:
duration: "1-2 hours"
steps:
- step: "Full application testing"
scope: "All critical applications"
- step: "Performance comparison"
baseline: "Pre-migration metrics"
- step: "HA validation"
test: "Failover and failback"
7.3.4 Site Migration Automation¶
Migration Automation Script¶
#!/usr/bin/env python3
"""
Site Migration Automation
Automates validation steps during site migration
"""
import requests
import json
import time
from datetime import datetime
class SiteMigrationAutomation:
def __init__(self, vmanage_host, username, password):
self.base_url = f"https://{vmanage_host}"
self.session = requests.Session()
self.session.verify = False
self.authenticate(username, password)
self.migration_log = []
def authenticate(self, username, password):
"""Authenticate to vManage"""
auth_url = f"{self.base_url}/j_security_check"
payload = {'j_username': username, 'j_password': password}
self.session.post(auth_url, data=payload)
token_url = f"{self.base_url}/dataservice/client/token"
token_response = self.session.get(token_url)
if token_response.status_code == 200:
self.session.headers['X-XSRF-TOKEN'] = token_response.text
def log(self, message, level='INFO'):
"""Log migration event"""
timestamp = datetime.now().isoformat()
entry = f"[{timestamp}] [{level}] {message}"
self.migration_log.append(entry)
print(entry)
def verify_device_online(self, system_ip, timeout=300):
"""Wait for device to come online"""
self.log(f"Waiting for device {system_ip} to come online...")
start_time = time.time()
while time.time() - start_time < timeout:
url = f"{self.base_url}/dataservice/device"
response = self.session.get(url)
if response.status_code == 200:
devices = response.json().get('data', [])
for device in devices:
if device.get('system-ip') == system_ip:
if device.get('reachability') == 'reachable':
self.log(f"Device {system_ip} is online")
return True
time.sleep(10)
self.log(f"Timeout waiting for device {system_ip}", 'ERROR')
return False
def verify_control_connections(self, system_ip):
"""Verify control plane connections"""
self.log(f"Verifying control connections for {system_ip}...")
url = f"{self.base_url}/dataservice/device/control/connections?deviceId={system_ip}"
response = self.session.get(url)
if response.status_code == 200:
connections = response.json().get('data', [])
vmanage_connected = False
vsmart_connected = 0
for conn in connections:
if conn.get('peer-type') == 'vmanage' and conn.get('state') == 'up':
vmanage_connected = True
elif conn.get('peer-type') == 'vsmart' and conn.get('state') == 'up':
vsmart_connected += 1
if vmanage_connected and vsmart_connected >= 1:
self.log(f"Control connections verified: vManage=Yes, vSmart={vsmart_connected}")
return True
else:
self.log(f"Control connections incomplete: vManage={vmanage_connected}, vSmart={vsmart_connected}", 'WARNING')
return False
self.log("Failed to check control connections", 'ERROR')
return False
def verify_bfd_sessions(self, system_ip):
"""Verify BFD tunnel sessions"""
self.log(f"Verifying BFD sessions for {system_ip}...")
url = f"{self.base_url}/dataservice/device/bfd/sessions?deviceId={system_ip}"
response = self.session.get(url)
if response.status_code == 200:
sessions = response.json().get('data', [])
up_count = sum(1 for s in sessions if s.get('state') == 'up')
total_count = len(sessions)
self.log(f"BFD sessions: {up_count}/{total_count} up")
return up_count > 0
self.log("Failed to check BFD sessions", 'ERROR')
return False
def verify_omp_routes(self, system_ip):
"""Verify OMP route reception"""
self.log(f"Verifying OMP routes for {system_ip}...")
url = f"{self.base_url}/dataservice/device/omp/routes?deviceId={system_ip}"
response = self.session.get(url)
if response.status_code == 200:
routes = response.json().get('data', [])
route_count = len(routes)
self.log(f"OMP routes received: {route_count}")
return route_count > 0
self.log("Failed to check OMP routes", 'ERROR')
return False
def run_migration_validation(self, system_ip):
"""Run complete migration validation sequence"""
self.log(f"Starting migration validation for {system_ip}")
self.log("=" * 60)
results = {
'device_online': False,
'control_connections': False,
'bfd_sessions': False,
'omp_routes': False,
'overall': False
}
# Step 1: Wait for device online
results['device_online'] = self.verify_device_online(system_ip)
if not results['device_online']:
self.log("MIGRATION VALIDATION FAILED: Device not online", 'ERROR')
return results
# Step 2: Verify control connections
results['control_connections'] = self.verify_control_connections(system_ip)
# Step 3: Verify BFD sessions
results['bfd_sessions'] = self.verify_bfd_sessions(system_ip)
# Step 4: Verify OMP routes
results['omp_routes'] = self.verify_omp_routes(system_ip)
# Overall result
results['overall'] = all([
results['control_connections'],
results['bfd_sessions'],
results['omp_routes']
])
self.log("=" * 60)
if results['overall']:
self.log("MIGRATION VALIDATION PASSED", 'SUCCESS')
else:
self.log("MIGRATION VALIDATION FAILED", 'ERROR')
return results
def get_migration_log(self):
"""Get migration log"""
return "\n".join(self.migration_log)
if __name__ == "__main__":
automation = SiteMigrationAutomation(
vmanage_host="10.100.1.10",
username="admin",
password="admin_password"
)
# Run validation for migrating device
results = automation.run_migration_validation("10.10.50.1")
print("\n" + automation.get_migration_log())
7.3.5 Migration Tracking¶
Migration Status Dashboard¶
migration_tracking:
dashboard_metrics:
overall_progress:
total_sites: 9
completed: 0
in_progress: 0
pending: 9
by_phase:
pilot: "1 site"
branch_rollout: "4 sites"
hub_migration: "3 sites"
primary_hub: "1 site"
site_status_template:
site_name: ""
status: "Pending|Scheduled|In Progress|Completed|Rolled Back"
scheduled_date: ""
actual_start: ""
actual_end: ""
duration: ""
issues: []
notes: ""
Migration Tracker Spreadsheet¶
| Site | Phase | Status | Scheduled | Start | End | Duration | Issues |
|------------|-------|-----------|-------------|-------------|-------------|----------|--------|
| Bangalore | Pilot | Pending | 2025-02-01 | - | - | - | - |
| Delhi | 2 | Pending | 2025-02-08 | - | - | - | - |
| Noida | 2 | Pending | 2025-02-10 | - | - | - | - |
| Frankfurt | 2 | Pending | 2025-02-15 | - | - | - | - |
| Dallas | 2 | Pending | 2025-02-17 | - | - | - | - |
| Chennai | 3 | Pending | 2025-02-22 | - | - | - | - |
| London | 3 | Pending | 2025-02-24 | - | - | - | - |
| New Jersey | 3 | Pending | 2025-03-01 | - | - | - | - |
| Mumbai | 4 | Pending | 2025-03-08 | - | - | - | - |
Document version: 1.0 Last updated: 2025 Classification: Internal Use