Support for QCT switches

Change-Id: Iacb4720b2bdee2f26b0c4b228e52e5c75b7a070f
diff --git a/roles/fabric-switch/defaults/main.yml b/roles/fabric-switch/defaults/main.yml
index cf733fb..9526484 100644
--- a/roles/fabric-switch/defaults/main.yml
+++ b/roles/fabric-switch/defaults/main.yml
@@ -13,6 +13,18 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-
+---
 pub_ssh_key_file_location: "{{ pub_ssh_key_location | default ('/etc/maas/.ssh') }}"
 pub_ssh_key: "{{ lookup('file', pub_ssh_key_file_location+'/cord_rsa.pub') }}"
+
+switch_ouis:
+  - accton:
+    - "cc37ab"
+    - "7072cf"
+    - "c4393a"
+    - "8cea1b"
+    - "a82bb5"
+    - "480fcf"
+  - qct:
+    - "2c600c"
+    - "54ab3a"
diff --git a/roles/fabric-switch/tasks/main.yml b/roles/fabric-switch/tasks/main.yml
index 97327bc..5d0f769 100644
--- a/roles/fabric-switch/tasks/main.yml
+++ b/roles/fabric-switch/tasks/main.yml
@@ -15,11 +15,16 @@
 
 ---
 - name: Generate DPID
-  shell: ifconfig ma1 | grep HWaddr | awk '{ print "0x0000"$5 }' | sed s/://g
+  shell: ifconfig | grep HWaddr | head -1 | awk '{ print "0x0000"$5 }' | sed s/://g
   register: dpid
   changed_when: false
 
-- name: Ensure ofdpa Config
+- name: Get switch OUI
+  shell: ifconfig | grep HWaddr | head -1 | awk '{ print $5 }' | sed s/://g | cut -c1-6
+  register: oui
+  changed_when: false
+
+- name: Ensure OFDPA Config
   set_fact:
     switch_id: "{{ dpid.stdout }}"
     controller_ip: "onos-fabric"
@@ -35,22 +40,26 @@
   changed_when: false
   when: ofdpa_exists.stdout != "0"
 
-# Note: This is the version number of OFDPA 3.0 EA4
-- name: Version 2.0.4.0 Openflow Agent
+- name: Install OFDPA commons steps
   include: ofdpa.yml
-  when: ofdpa_exists.stdout == "0" or ofdpa_version.stderr.find('version 2.0.4.0') == -1
+  when: ofdpa_exists.stdout == "0" or
+        (ofdpa_version.stdout.find('3.0.4.0') == -1 and ofdpa_version.stdout.find('3.0.5.0') == -1)
 
-- name: Utilities Scripts
-  template:
-    src: "{{ item }}"
-    dest: /root
-    owner: root
-    group: root
-    mode: "0755"
-  with_items:
-    - killit
-    - connect
-  register: utils
+- name: Install OFDPA for Accton switches
+  include: ofdpa-accton.yml lsb_stat="{{ lsb_stat }}" dist="{{ dist }}"
+  with_items: "{{ switch_ouis.accton|default([]) }}"
+  when:
+    - ofdpa_exists.stdout == "0" or ofdpa_version.stderr.find('3.0.4.0') == -1
+    # Accton related OUIs
+    - oui.stdout == item
+
+- name: Install OFDPA for QCT switches
+  include: ofdpa-qct.yml lsb_stat="{{ lsb_stat }}" dist="{{ dist }}"
+  with_items: "{{ switch_ouis.qct|default([]) }}"
+  when:
+    - ofdpa_exists.stdout == "0" or ofdpa_version.stderr.find('3.0.5.0') == -1
+    # Accton related OUIs
+    - oui.stdout == item
 
 - name: Authorize SSH Key
   become: yes
@@ -59,4 +68,3 @@
     user=root
     state=present
   register: sshkey
-
diff --git a/roles/fabric-switch/tasks/ofdpa-accton.yml b/roles/fabric-switch/tasks/ofdpa-accton.yml
new file mode 100644
index 0000000..598adcb
--- /dev/null
+++ b/roles/fabric-switch/tasks/ofdpa-accton.yml
@@ -0,0 +1,26 @@
+
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+- name: Openflow Accton Agent Debian Archive
+  get_url:
+    url: https://github.com/onfsdn/atrium-docs/blob/master/16A/ONOS/builds/ofdpa_3.0.4.0+accton1.0~1-1_amd64.deb?raw=true
+    validate_certs: false
+    checksum: "sha256:e0b10051b2032454132c6634a0896883e1548e0c39b847ff10933e559b95a729"
+    dest: /mnt/onl/data/ofdpa_3.0.4.0+accton1.0~1-1_amd64.deb
+
+- name: Openflow Agent Installed
+  apt: deb="/mnt/onl/data/ofdpa_3.0.4.0+accton1.0~1-1_amd64.deb" force=true
+  when: not lsb_stat.stat.exists or dist.stdout == "0"
diff --git a/roles/fabric-switch/tasks/ofdpa-qct.yml b/roles/fabric-switch/tasks/ofdpa-qct.yml
new file mode 100644
index 0000000..f4e78fe
--- /dev/null
+++ b/roles/fabric-switch/tasks/ofdpa-qct.yml
@@ -0,0 +1,26 @@
+
+# Copyright 2017-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+---
+- name: Openflow Quanta Agent Debian Archive
+  get_url:
+    url: https://github.com/onfsdn/atrium-docs/raw/master/16A/ONOS/builds/ofdpa-ly8_0.3.0.5.0-EA5-qct-00.03_amd64.deb
+    validate_certs: false
+    checksum: "sha256:1c2aae5e4596b4c73c7ac63209dd1d303d4aaf794daadff7f5de3d476d0335a5"
+    dest: /mnt/onl/data/ofdpa-ly8_0.3.0.5.0-EA5-qct-0.0_amd64.deb
+
+- name: Openflow Agent Installed
+  apt: deb="/mnt/onl/data/ofdpa-ly8_0.3.0.5.0-EA5-qct-00.03_amd64.deb" force=true
+  when: not lsb_stat.stat.exists or dist.stdout == "0"
diff --git a/roles/fabric-switch/tasks/ofdpa.yml b/roles/fabric-switch/tasks/ofdpa.yml
index ace1f2b..9d8fb43 100644
--- a/roles/fabric-switch/tasks/ofdpa.yml
+++ b/roles/fabric-switch/tasks/ofdpa.yml
@@ -14,13 +14,6 @@
 # limitations under the License.
 
 ---
-- name: Openflow Agent Debian Archive
-  get_url:
-    url: https://github.com/onfsdn/atrium-docs/blob/master/16A/ONOS/builds/ofdpa_3.0.4.0+accton1.0~1-1_amd64.deb?raw=true
-    validate_certs: false
-    checksum: "sha256:e0b10051b2032454132c6634a0896883e1548e0c39b847ff10933e559b95a729"
-    dest: /mnt/onl/data/ofdpa_3.0.4.0+accton1.0~1-1_amd64.deb
-
 # We want to kill old agents and stop the old OFDPA service before removing
 - name: OpenFlow Agent Is Not Running
   command: killall ofagentapp
@@ -59,12 +52,19 @@
   changed_when: false
   failed_when: false
 
-- name: Verify Distribute Name
+- name: Verify Distribute Release Name
   shell: grep -i ubuntu /etc/lsb-release | wc -l
   register: dist
   changed_when: false
   failed_when: false
 
-- name: Openflow Agent Installed
-  apt: deb="/mnt/onl/data/ofdpa_3.0.4.0+accton1.0~1-1_amd64.deb" force=true
-  when: not lsb_stat.stat.exists or dist.stdout == "0"
+- name: Utilities Scripts
+  template:
+    src: "{{ item }}"
+    dest: /root
+    owner: root
+    group: root
+    mode: "0755"
+  with_items:
+    - killit
+    - connect
diff --git a/roles/maas/defaults/main.yml b/roles/maas/defaults/main.yml
index 8eb81ba..a3e3dbc 100644
--- a/roles/maas/defaults/main.yml
+++ b/roles/maas/defaults/main.yml
@@ -20,6 +20,9 @@
   - name: "ONL-2.0.0_ONL-OS_2017-01-04.0024-8d23df5_AMD64_INSTALLED_INSTALLER"
     url: 'https://github.com/opencord/OpenNetworkLinux/releases/download/2017-01-04.0024-8d23df5/ONL-2.0.0_ONL-OS_2017-01-04.0024-8d23df5_AMD64_INSTALLED_INSTALLER'
     checksum: "sha256:4ed90086cafc3899ddb10ab7bac8677d8ece27de3ed28ed385c12aba8d53c0a9"
+  - name: "ONL-2.0.0_ONL-OS_2017-10-19.2200-1211610_AMD64_INSTALLED_INSTALLER"
+    url: 'https://github.com/opencord/OpenNetworkLinux/releases/download/2017-10-19.2200-1211610/ONL-2.0.0_ONL-OS_2017-10-19.2200-1211610_AMD64_INSTALLED_INSTALLER'
+    checksum: "sha256:2db316ea83f5dc761b9b11cc8542f153f092f3b49d82ffc0a36a2c41290f5421"
 
 # Add specific models of switches here - the value of boot_image should be the
 # name of an image in the switch_boot_images list given above
@@ -30,6 +33,8 @@
     boot_image: "ONL-2.0.0_ONL-OS_2017-01-04.0024-8d23df5_AMD64_INSTALLED_INSTALLER"
   - name: "onie-installer-x86_64-accton_as6712_32x-r0"
     boot_image: "ONL-2.0.0_ONL-OS_2017-01-04.0024-8d23df5_AMD64_INSTALLED_INSTALLER"
+  - name: "onie-installer-x86_64-quanta_ly8_rangeley-r0"
+    boot_image: "ONL-2.0.0_ONL-OS_2017-10-19.2200-1211610_AMD64_INSTALLED_INSTALLER"
 
 pub_ssh_key_file_location: "{{ pub_ssh_key_location | default ('/etc/maas/.ssh') }}"
 
diff --git a/switchq/vendors.go b/switchq/vendors.go
index 96f4af6..cc4eb94 100644
--- a/switchq/vendors.go
+++ b/switchq/vendors.go
@@ -61,13 +61,24 @@
 }
 
 func (v *VendorsData) Switchq(mac string) (bool, error) {
-	if len(mac) < 8 {
-		return false, nil
-	}
-	rec, ok := v.Vendors[strings.ToUpper(mac[0:8])]
-	if !ok || !rec.Provision {
-		return false, nil
+	// If there is a "full" MAC then attempt to see if that can
+	// be matched. If matched, accept that result and look no
+	// further
+	if len(mac) == 17 {
+		if rec, ok := v.Vendors[strings.ToUpper(mac)]; ok {
+			return rec.Provision, nil
+		}
 	}
 
-	return true, nil
+	// If we have at least a OUI, look to see if that can be
+	// be matched. If matched, accept that result and look no
+	// further.
+	if len(mac) >= 8 {
+		if rec, ok := v.Vendors[strings.ToUpper(mac[0:8])]; ok {
+			return rec.Provision, nil
+		}
+	}
+
+	// No match found, so assume false.
+	return false, nil
 }
diff --git a/switchq/vendors.json b/switchq/vendors.json
index f78d827..39d3b30 100644
--- a/switchq/vendors.json
+++ b/switchq/vendors.json
@@ -28,5 +28,10 @@
     "prefix" : "48:0F:CF",
     "vendor" : "Hewlett Packard Enterprise",
     "provision" : true
+  },
+  {
+    "prefix" : "54:AB:3A",
+    "vendor" : "Quanta QCT",
+    "provision" : true
   }
 ]