aboutsummaryrefslogtreecommitdiffstats
path: root/Software
diff options
context:
space:
mode:
authorRoy Ben-Shabat <Roy@Twine-s.com>2020-02-03 19:57:18 +0200
committerRoy Ben-Shabat <Roy@Twine-s.com>2020-02-03 19:57:18 +0200
commit384ef8966066b6c2ee973b906ff78418f533f174 (patch)
treed8c568a722e2ff113ca3176013d80593fdd64cd2 /Software
parent45e7cad9ca890376374b9485bac7818ccbc4d70e (diff)
downloadTango-384ef8966066b6c2ee973b906ff78418f533f174.tar.gz
Tango-384ef8966066b6c2ee973b906ff78418f533f174.zip
Working on Azure Utils.
Diffstat (limited to 'Software')
-rw-r--r--Software/DB/SQLExaminer Projects/GENERAL_ENV_UPGRADE.sdeproj1116
-rw-r--r--Software/DB/SQLExaminer Projects/GENERAL_ENV_UPGRADE.seproj72
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils.UI/App.config4
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils.UI/MainWindow.xaml.cs29
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Tango.AzureUtils.UI.csproj4
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentManager.cs484
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentProgressEventArgs.cs17
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentStage.cs16
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/ExtensionMethods.cs18
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/UpgradeConfiguration.cs15
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Tango.AzureUtils.csproj32
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/app.config14
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/packages.config2
13 files changed, 1788 insertions, 35 deletions
diff --git a/Software/DB/SQLExaminer Projects/GENERAL_ENV_UPGRADE.sdeproj b/Software/DB/SQLExaminer Projects/GENERAL_ENV_UPGRADE.sdeproj
new file mode 100644
index 000000000..300a67594
--- /dev/null
+++ b/Software/DB/SQLExaminer Projects/GENERAL_ENV_UPGRADE.sdeproj
@@ -0,0 +1,1116 @@
+<SqlDataExaminer version="21">
+ <Sources>
+ <Source id="1">
+ <EngineType>MsSqlAzure</EngineType>
+ <StorageType>LiveDb</StorageType>
+ <ServerName>twine.database.windows.net</ServerName>
+ <Database>Tango_DEV</Database>
+ <WinAuth>False</WinAuth>
+ <AzureAuthMode>SqlServer</AzureAuthMode>
+ <Login>Roy</Login>
+ <Password>Aa123456</Password>
+ <SavePasswords>true</SavePasswords>
+ </Source>
+ <Source id="2">
+ <EngineType>MsSqlAzure</EngineType>
+ <StorageType>LiveDb</StorageType>
+ <ServerName>twine.database.windows.net</ServerName>
+ <Database>Tango_ALPHA</Database>
+ <WinAuth>False</WinAuth>
+ <AzureAuthMode>SqlServer</AzureAuthMode>
+ <Login>Roy</Login>
+ <Password>Aa123456</Password>
+ <SavePasswords>true</SavePasswords>
+ </Source>
+ </Sources>
+ <Items>
+ <Item name="dbo.ACTION_LOGS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="TYPE" />
+ <Column name="USER_GUID" />
+ <Column name="RELATED_OBJECT_NAME" />
+ <Column name="RELATED_OBJECT_GUID" />
+ <Column name="MESSAGE" />
+ <Column name="DIFFERENCE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.ADDRESSES" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="ADDRESS_STRING" />
+ <Column name="LOCALITY" />
+ <Column name="COUNTRY" />
+ <Column name="CITY" />
+ <Column name="STATE" />
+ <Column name="COUNTRY_CODE" />
+ <Column name="POSTAL_CODE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.APPLICATION_DISPLAY_PANEL_VERSIONS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="VERSION" />
+ <Column name="NAME" />
+ </Columns>
+ </Item>
+ <Item name="dbo.APPLICATION_FIRMWARE_VERSIONS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="VERSION" />
+ <Column name="NAME" />
+ </Columns>
+ </Item>
+ <Item name="dbo.APPLICATION_OS_VERSIONS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="VERSION" />
+ <Column name="NAME" />
+ </Columns>
+ </Item>
+ <Item name="dbo.BRUSH_STOPS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="SEGMENT_GUID" />
+ <Column name="COLOR_SPACE_GUID" />
+ <Column name="OFFSET_PERCENT" />
+ <Column name="STOP_INDEX" />
+ <Column name="CYAN" />
+ <Column name="MAGENTA" />
+ <Column name="YELLOW" />
+ <Column name="BLACK" />
+ <Column name="RED" />
+ <Column name="GREEN" />
+ <Column name="BLUE" />
+ <Column name="L" />
+ <Column name="A" />
+ <Column name="B" />
+ <Column name="V0" />
+ <Column name="V0_DIV" />
+ <Column name="V1" />
+ <Column name="V1_DIV" />
+ <Column name="V2" />
+ <Column name="V2_DIV" />
+ <Column name="V3" />
+ <Column name="V3_DIV" />
+ <Column name="V4" />
+ <Column name="V4_DIV" />
+ <Column name="V5" />
+ <Column name="V5_DIV" />
+ <Column name="V6" />
+ <Column name="V6_DIV" />
+ <Column name="V7" />
+ <Column name="V7_DIV" />
+ <Column name="CORRECTED" />
+ <Column name="COLOR_CATALOG_GUID" />
+ <Column name="COLOR_CATALOGS_ITEM_GUID" />
+ <Column name="IS_TRANSPARENT" />
+ </Columns>
+ </Item>
+ <Item name="dbo.CARTRIDGE_TYPES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ </Columns>
+ </Item>
+ <Item name="dbo.CATS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="NAME" />
+ <Column name="MACHINE_GUID" />
+ <Column name="RML_GUID" />
+ <Column name="LIQUID_TYPE_GUID" />
+ <Column name="DATA" />
+ </Columns>
+ </Item>
+ <Item name="dbo.CCTS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ <Column name="FILE_NAME" />
+ <Column name="DATA" />
+ </Columns>
+ </Item>
+ <Item name="dbo.COLOR_CATALOGS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="COMPANY" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ <Column name="DESIGN_TYPE" />
+ <Column name="LOGO" />
+ <Column name="IMAGE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.COLOR_CATALOGS_GROUPS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="NAME" />
+ <Column name="GROUP_INDEX" />
+ <Column name="COLOR_CATALOG_GUID" />
+ </Columns>
+ </Item>
+ <Item name="dbo.COLOR_CATALOGS_ITEMS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="COLOR_CATALOGS_GROUP_GUID" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="ITEM_INDEX" />
+ <Column name="CYAN" />
+ <Column name="MAGENTA" />
+ <Column name="YELLOW" />
+ <Column name="BLACK" />
+ <Column name="RED" />
+ <Column name="GREEN" />
+ <Column name="BLUE" />
+ <Column name="L" />
+ <Column name="A" />
+ <Column name="B" />
+ <Column name="PROCESS_PARAMETERS_TABLE_INDEX" />
+ </Columns>
+ </Item>
+ <Item name="dbo.COLOR_CATALOGS_ITEMS_RECIPES" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="COLOR_CATALOGS_ITEM_GUID" />
+ <Column name="RML_GUID" />
+ <Column name="CYAN" />
+ <Column name="MAGENTA" />
+ <Column name="YELLOW" />
+ <Column name="BLACK" />
+ <Column name="PROCESS_PARAMETERS_TABLE_INDEX" />
+ </Columns>
+ </Item>
+ <Item name="dbo.COLOR_SPACES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ <Column name="THUMBNAIL" />
+ </Columns>
+ </Item>
+ <Item name="dbo.CONFIGURATIONS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="APPLICATION_OS_VERSION_GUID" />
+ <Column name="APPLICATION_FIRMWARE_VERSION_GUID" />
+ <Column name="APPLICATION_DISPLAY_PANEL_VERSION_GUID" />
+ <Column name="EMBEDDED_FIRMWARE_VERSION_GUID" />
+ <Column name="HARDWARE_VERSION_GUID" />
+ <Column name="HARDWARE_CONFIGURATION_STRING" />
+ </Columns>
+ </Item>
+ <Item name="dbo.CONTACTS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="FIRST_NAME" />
+ <Column name="LAST_NAME" />
+ <Column name="FULL_NAME" />
+ <Column name="EMAIL" />
+ <Column name="PHONE_NUMBER" />
+ <Column name="FAX" />
+ </Columns>
+ </Item>
+ <Item name="dbo.CUSTOMERS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="ORGANIZATION_GUID" />
+ <Column name="NAME" />
+ </Columns>
+ </Item>
+ <Item name="dbo.DISPENSER_TYPES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="CAPACITY" />
+ </Columns>
+ </Item>
+ <Item name="dbo.DISPENSERS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="SERIAL_NUMBER" />
+ <Column name="DISPENSER_TYPE_GUID" />
+ <Column name="NL_PER_PULSE" />
+ <Column name="PART_NUMBER" />
+ <Column name="PCB_SERIAL" />
+ <Column name="PCB_VERSION" />
+ <Column name="PRODUCTION_DATE" />
+ <Column name="CALIBRATION_DATA" />
+ </Columns>
+ </Item>
+ <Item name="dbo.EMBEDDED_FIRMWARE_VERSIONS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="VERSION" />
+ <Column name="NAME" />
+ </Columns>
+ </Item>
+ <Item name="dbo.EVENT_TYPES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="TITLE" />
+ <Column name="DESCRIPTION" />
+ <Column name="TECHNICAL_DESCRIPTION" />
+ <Column name="COMPONENT_INDEX" />
+ <Column name="EVENT_CATEGORY" />
+ <Column name="EVENT_GROUP" />
+ <Column name="EVENT_NOTIFICATION_TIME" />
+ <Column name="EVENT_ACTIONS" />
+ <Column name="REQUIRES_USER_INTERVENTION" />
+ <Column name="GUIDANCE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.FIBER_SHAPES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="NAME" />
+ <Column name="CODE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.FIBER_SYNTHS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="NAME" />
+ <Column name="CODE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.HARDWARE_BLOWER_TYPES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ </Columns>
+ </Item>
+ <Item name="dbo.HARDWARE_BLOWERS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="HARDWARE_BLOWER_TYPE_GUID" />
+ <Column name="HARDWARE_VERSION_GUID" />
+ <Column name="ENABLED" />
+ <Column name="VOLTAGE" />
+ <Column name="HEATING_VOLTAGE" />
+ <Column name="ACTIVE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.HARDWARE_BREAK_SENSOR_TYPES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ </Columns>
+ </Item>
+ <Item name="dbo.HARDWARE_BREAK_SENSORS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="HARDWARE_BREAK_SENSOR_TYPE_GUID" />
+ <Column name="HARDWARE_VERSION_GUID" />
+ <Column name="ENABLED" />
+ <Column name="DE_BOUNCE_TIME_MILLI" />
+ <Column name="ACTIVE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.HARDWARE_DANCER_TYPES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ </Columns>
+ </Item>
+ <Item name="dbo.HARDWARE_DANCERS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="HARDWARE_DANCER_TYPE_GUID" />
+ <Column name="HARDWARE_VERSION_GUID" />
+ <Column name="GRADUAL" />
+ <Column name="K" />
+ <Column name="X" />
+ <Column name="PULSE_PER_MM_SPRING" />
+ <Column name="MAXIMAL_MOVEMENT_MM" />
+ <Column name="ZERO_POINT" />
+ <Column name="RESOLUTION_BITS" />
+ <Column name="ARM_LENGTH" />
+ <Column name="ASSEMBLY_DIRECTION_RIGHT" />
+ <Column name="ACCELERATE_ON_TENSION_RAISE" />
+ <Column name="ACTIVE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.HARDWARE_MOTOR_TYPES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ <Column name="SUPPORTS_HOMING" />
+ </Columns>
+ </Item>
+ <Item name="dbo.HARDWARE_MOTORS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="HARDWARE_MOTOR_TYPE_GUID" />
+ <Column name="HARDWARE_VERSION_GUID" />
+ <Column name="MIN_FREQUENCY" />
+ <Column name="MAX_FREQUENCY" />
+ <Column name="SET_MICRO_STEP" />
+ <Column name="MICRO_STEP" />
+ <Column name="MAX_CHANGE_SLOPE" />
+ <Column name="HIGH_LENGTH_MICRO_SECOND" />
+ <Column name="SPEED_MASTER" />
+ <Column name="PULSE_PER_ROUND" />
+ <Column name="PULLEY_RADIUS" />
+ <Column name="CONFIG_WORD" />
+ <Column name="DIRECTION_THREAD_WIZE" />
+ <Column name="KVAL_HOLD" />
+ <Column name="KVAL_RUN" />
+ <Column name="KVAL_ACC" />
+ <Column name="KVAL_DEC" />
+ <Column name="OVER_CURRENT_THRESHOLD" />
+ <Column name="STALL_THRESHOLD" />
+ <Column name="THERMAL_COMPENSATION_FACTOR" />
+ <Column name="LOW_SPEED_OPTIMIZATION" />
+ <Column name="ST_SLP" />
+ <Column name="INT_SPD" />
+ <Column name="FN_SLP_ACC" />
+ <Column name="FN_SLP_DEC" />
+ <Column name="FS_SPD" />
+ <Column name="GATE_CFG_1" />
+ <Column name="GATE_CFG_2" />
+ <Column name="T_VAL_HOLD" />
+ <Column name="T_VAL_RUN" />
+ <Column name="T_VAL_ACC" />
+ <Column name="T_VAL_DEC" />
+ <Column name="T_FAST" />
+ <Column name="T_ON_MIN" />
+ <Column name="T_OFF_MIN" />
+ <Column name="ACTIVE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.HARDWARE_PID_CONTROL_TYPES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ </Columns>
+ </Item>
+ <Item name="dbo.HARDWARE_PID_CONTROLS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="HARDWARE_PID_CONTROL_TYPE_GUID" />
+ <Column name="HARDWARE_VERSION_GUID" />
+ <Column name="OUTPUT_PROPORTIONAL_POWER_LIMIT" />
+ <Column name="OUTPUT_PROPORTIONAL_BAND" />
+ <Column name="INTEGRAL_TIME" />
+ <Column name="DERIVATIVE_TIME" />
+ <Column name="SENSOR_CORRECTION_ADJUSTMENT" />
+ <Column name="SENSOR_MIN_VALUE" />
+ <Column name="SENSOR_MAX_VALUE" />
+ <Column name="SET_POINT_RAMP_RATEOR_SOFT_START_RAMP" />
+ <Column name="SET_POINT_CONTROL_OUTPUT_RATE" />
+ <Column name="CONTROL_OUTPUT_TYPE" />
+ <Column name="SSR_CONTROL_OUTPUT_TYPE" />
+ <Column name="OUTPUT_ON_OFF_HYSTERESIS_VALUE" />
+ <Column name="PROCESS_VARIABLE_SAMPLING_RATE" />
+ <Column name="PV_INPUT_FILTER_FACTOR_MODE" />
+ <Column name="OUTPUT_PROPORTIONAL_CYCLE_TIME" />
+ <Column name="AC_HEATERS__HALF_CYCLE_TIME" />
+ <Column name="PROPORTIONAL_GAIN" />
+ <Column name="PID_ACTIVE" />
+ <Column name="EPSILON" />
+ <Column name="ACTIVE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.HARDWARE_SPEED_SENSOR_TYPES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ </Columns>
+ </Item>
+ <Item name="dbo.HARDWARE_SPEED_SENSORS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="HARDWARE_SPEED_SENSOR_TYPE_GUID" />
+ <Column name="HARDWARE_VERSION_GUID" />
+ <Column name="RESOLUTION_BITS" />
+ <Column name="PERIMETER" />
+ <Column name="ACTIVE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.HARDWARE_VERSIONS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="VERSION" />
+ <Column name="NAME" />
+ </Columns>
+ </Item>
+ <Item name="dbo.HARDWARE_WINDER_TYPES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ </Columns>
+ </Item>
+ <Item name="dbo.HARDWARE_WINDERS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="HARDWARE_WINDER_TYPE_GUID" />
+ <Column name="HARDWARE_VERSION_GUID" />
+ <Column name="MILLIMETER_PER_ROTATION" />
+ <Column name="ACTIVE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.IDS_PACK_FORMULAS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ <Column name="AUTO_CALCULATED" />
+ </Columns>
+ </Item>
+ <Item name="dbo.IDS_PACKS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CONFIGURATION_GUID" />
+ <Column name="DISPENSER_GUID" />
+ <Column name="LIQUID_TYPE_GUID" />
+ <Column name="CARTRIDGE_TYPE_GUID" />
+ <Column name="MID_TANK_TYPE_GUID" />
+ <Column name="IDS_PACK_FORMULA_GUID" />
+ <Column name="PACK_INDEX" />
+ <Column name="IS_EMPTY" />
+ </Columns>
+ </Item>
+ <Item name="dbo.JOB_RUNS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="MACHINE_GUID" />
+ <Column name="JOB_GUID" />
+ <Column name="START_DATE" />
+ <Column name="END_DATE" />
+ <Column name="STATUS" />
+ <Column name="END_POSITION" />
+ <Column name="FAILED_MESSAGE" />
+ <Column name="IS_SYNCHRONIZED" />
+ </Columns>
+ </Item>
+ <Item name="dbo.JOBS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CREATION_DATE" />
+ <Column name="LAST_RUN" />
+ <Column name="MACHINE_GUID" />
+ <Column name="USER_GUID" />
+ <Column name="RML_GUID" />
+ <Column name="WINDING_METHOD_GUID" />
+ <Column name="SPOOL_TYPE_GUID" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ <Column name="INTER_SEGMENT_LENGTH" />
+ <Column name="ENABLE_INTER_SEGMENT" />
+ <Column name="ENABLE_LUBRICATION" />
+ <Column name="JOB_INDEX" />
+ <Column name="ESTIMATED_DURATION_MILI" />
+ <Column name="HAS_EMBROIDERY_FILE" />
+ <Column name="EMBROIDERY_FILE_DATA" />
+ <Column name="EMBROIDERY_FILE_NAME" />
+ <Column name="EMBROIDERY_JPEG" />
+ <Column name="STATUS" />
+ <Column name="COLOR_SPACE_GUID" />
+ <Column name="COLOR_CATALOG_GUID" />
+ <Column name="NUMBER_OF_UNITS" />
+ <Column name="TYPE" />
+ <Column name="CUSTOMER_GUID" />
+ <Column name="SPOOLS_DISTRIBUTION" />
+ <Column name="NUMBER_OF_HEADS" />
+ <Column name="SAMPLE_UNITS_OR_METERS" />
+ <Column name="FINE_TUNING_STATUS" />
+ <Column name="FINE_TUNING_APPROVE_DATE" />
+ <Column name="SAMPLE_DYE_STATUS" />
+ <Column name="SAMPLE_DYE_APPROVE_DATE" />
+ <Column name="EDITING_STATE" />
+ <Column name="LENGTH_PERCENTAGE_FACTOR" />
+ <Column name="IS_SYNCHRONIZED" />
+ <Column name="SOURCE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.LINEAR_MASS_DENSITY_UNITS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="NAME" />
+ <Column name="CODE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.LIQUID_TYPES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="VERSION" />
+ <Column name="COLOR" />
+ <Column name="PREFERRED_INDEX" />
+ <Column name="HAS_PIGMENT" />
+ </Columns>
+ </Item>
+ <Item name="dbo.LIQUID_TYPES_RMLS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="LIQUID_TYPE_GUID" />
+ <Column name="RML_GUID" />
+ <Column name="MAX_NL_PER_CM" />
+ <Column name="DEFAULT_CAT_DATA" />
+ </Columns>
+ </Item>
+ <Item name="dbo.MACHINE_STUDIO_VERSIONS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="VERSION" />
+ <Column name="BLOB_NAME" />
+ <Column name="INSTALLER_BLOB_NAME" />
+ <Column name="COMMENTS" />
+ <Column name="USER_GUID" />
+ </Columns>
+ </Item>
+ <Item name="dbo.MACHINE_VERSIONS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="VERSION" />
+ <Column name="NAME" />
+ <Column name="PROTOTYPE_MACHINE_DATA" />
+ </Columns>
+ </Item>
+ <Item name="dbo.MACHINES" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="SERIAL_NUMBER" />
+ <Column name="NAME" />
+ <Column name="PRODUCTION_DATE" />
+ <Column name="ORGANIZATION_GUID" />
+ <Column name="SITE_GUID" />
+ <Column name="MACHINE_VERSION_GUID" />
+ <Column name="CONFIGURATION_GUID" />
+ <Column name="DEFAULT_RML_GUID" />
+ <Column name="LOADED_RML_GUID" />
+ <Column name="TARGET_JOB_TYPES" />
+ <Column name="TARGET_COLOR_SPACE_CODES" />
+ <Column name="DEFAULT_COLOR_SPACE_GUID" />
+ <Column name="DEFAULT_SEGMENT_LENGTH" />
+ <Column name="DEFAULT_SPOOL_TYPE_GUID" />
+ <Column name="OS_KEY" />
+ <Column name="AUTO_LOGIN" />
+ <Column name="AUTO_CHECK_FOR_UPDATES" />
+ <Column name="SETUP_ACTIVATION" />
+ <Column name="SETUP_REMOTE_ASSISTANCE" />
+ <Column name="SETUP_UWF" />
+ <Column name="SETUP_FIRMWARE" />
+ <Column name="SETUP_FPGA" />
+ <Column name="IS_DEMO" />
+ <Column name="SUSPEND_VERSION_UPDATE" />
+ <Column name="FORCE_VERSION_UPDATE" />
+ <Column name="PERFORM_SCHEMA_UPDATE_ON_DATA_UPDATE" />
+ <Column name="DEVICE_COM_PORT" />
+ <Column name="IS_DEVICE_REGISTERED" />
+ <Column name="DEVICE_ID" />
+ <Column name="DEVICE_NAME" />
+ </Columns>
+ </Item>
+ <Item name="dbo.MACHINES_EVENTS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="HOST_NAME" />
+ <Column name="MACHINE_GUID" />
+ <Column name="EVENT_TYPE_GUID" />
+ <Column name="USER_GUID" />
+ <Column name="DATE_TIME" />
+ <Column name="DESCRIPTION" />
+ <Column name="IS_SYNCHRONIZED" />
+ </Columns>
+ </Item>
+ <Item name="dbo.MEDIA_CONDITIONS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="NAME" />
+ <Column name="CODE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.MEDIA_MATERIALS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="NAME" />
+ <Column name="CODE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.MEDIA_PURPOSES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="NAME" />
+ <Column name="CODE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.MID_TANK_TYPES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="LITER_CAPACITY" />
+ </Columns>
+ </Item>
+ <Item name="dbo.ORGANIZATIONS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="NAME" />
+ <Column name="CONTACT_GUID" />
+ <Column name="ADDRESS_GUID" />
+ </Columns>
+ </Item>
+ <Item name="dbo.PERMISSIONS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ </Columns>
+ </Item>
+ <Item name="dbo.PROCESS_PARAMETERS_TABLES" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="NAME" />
+ <Column name="DYEING_SPEED" />
+ <Column name="MIN_INK_UPTAKE" />
+ <Column name="MAX_INK_UPTAKE" />
+ <Column name="FEEDER_TENSION" />
+ <Column name="PULLER_TENSION" />
+ <Column name="WINDER_TENSION" />
+ <Column name="MIXER_TEMP" />
+ <Column name="HEAD_ZONE1_TEMP" />
+ <Column name="HEAD_ZONE2_TEMP" />
+ <Column name="HEAD_ZONE3_TEMP" />
+ <Column name="HEAD_ZONE4_TEMP" />
+ <Column name="HEAD_ZONE5_TEMP" />
+ <Column name="HEAD_ZONE6_TEMP" />
+ <Column name="DRYER_AIR_FLOW" />
+ <Column name="DRYER_ZONE1_TEMP" />
+ <Column name="DRYER_ZONE2_TEMP" />
+ <Column name="DRYER_ZONE3_TEMP" />
+ <Column name="DRYER_BUFFER_LENGTH" />
+ <Column name="HEAD_AIR_FLOW" />
+ <Column name="PROCESS_PARAMETERS_TABLES_GROUP_GUID" />
+ <Column name="TABLE_INDEX" />
+ </Columns>
+ </Item>
+ <Item name="dbo.PROCESS_PARAMETERS_TABLES_GROUPS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="RML_GUID" />
+ <Column name="NAME" />
+ <Column name="ACTIVE" />
+ <Column name="SAVE_DATE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.RMLS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="NAME" />
+ <Column name="MANUFACTURER" />
+ <Column name="CODE" />
+ <Column name="WHITE_POINT_L" />
+ <Column name="WHITE_POINT_A" />
+ <Column name="WHITE_POINT_B" />
+ <Column name="MEDIA_MATERIAL_GUID" />
+ <Column name="MEDIA_PURPOSE_GUID" />
+ <Column name="MEDIA_CONDITION_GUID" />
+ <Column name="LINEAR_MASS_DENSITY_UNIT_GUID" />
+ <Column name="FIBER_SHAPE_GUID" />
+ <Column name="FIBER_SYNTH_GUID" />
+ <Column name="FIBER_SIZE" />
+ <Column name="NUMBER_OF_FIBERS" />
+ <Column name="PLIES_PER_FIBER" />
+ <Column name="PLIES_PER_THREAD" />
+ <Column name="TWISTED" />
+ <Column name="AIR_ENTANGLEMENT" />
+ <Column name="LUBRICANT" />
+ <Column name="TENSILE_STRENGTH" />
+ <Column name="ELONGATION_AT_BREAK_PERCENTAGE" />
+ <Column name="ESTIMATED_THREAD_DIAMETER" />
+ <Column name="RANK" />
+ <Column name="THUMBNAIL" />
+ <Column name="CCT_GUID" />
+ <Column name="COLOR_CONVERSION_VERSION" />
+ </Columns>
+ </Item>
+ <Item name="dbo.ROLES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ </Columns>
+ </Item>
+ <Item name="dbo.ROLES_PERMISSIONS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="ROLE_GUID" />
+ <Column name="PERMISSION_GUID" />
+ </Columns>
+ </Item>
+ <Item name="dbo.SEGMENTS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="NAME" />
+ <Column name="JOB_GUID" />
+ <Column name="LENGTH" />
+ <Column name="SEGMENT_INDEX" />
+ </Columns>
+ </Item>
+ <Item name="dbo.SITES" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="ORGANIZATION_GUID" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ </Columns>
+ </Item>
+ <Item name="dbo.SITES_CATALOGS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="SITE_GUID" />
+ <Column name="COLOR_CATALOG_GUID" />
+ </Columns>
+ </Item>
+ <Item name="dbo.SITES_RMLS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="SITE_GUID" />
+ <Column name="RML_GUID" />
+ </Columns>
+ </Item>
+ <Item name="dbo.SPOOL_TYPES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="LENGTH" />
+ <Column name="WEIGHT" />
+ <Column name="DIAMETER" />
+ <Column name="ROTATIONS_PER_PASSAGE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.SPOOLS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="SPOOL_TYPE_GUID" />
+ <Column name="MACHINE_GUID" />
+ <Column name="START_OFFSET_PULSES" />
+ <Column name="BACKING_RATE" />
+ <Column name="SEGMENT_OFFSET_PULSES" />
+ <Column name="BOTTOM_BACKING_RATE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.SYNC_CONFIGURATIONS" type="table">
+ <Columns>
+ <Column name="ID" key="true" />
+ <Column name="TABLE_NAME" />
+ <Column name="SYNC_TYPE" />
+ </Columns>
+ </Item>
+ <Item name="dbo.TANGO_UPDATES" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="APPLICATION_VERSION" />
+ <Column name="FIRMWARE_VERSION" />
+ <Column name="MACHINE_GUID" />
+ <Column name="STATUS" />
+ <Column name="FAILED_REASON" />
+ <Column name="FAILED_LOG" />
+ <Column name="START_DATE" />
+ <Column name="END_DATE" />
+ <Column name="IS_SYNCHRONIZED" />
+ </Columns>
+ </Item>
+ <Item name="dbo.TANGO_VERSIONS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="VERSION" />
+ <Column name="FIRMWARE_VERSION" />
+ <Column name="BLOB_NAME" />
+ <Column name="INSTALLER_BLOB_NAME" />
+ <Column name="COMMENTS" />
+ <Column name="USER_GUID" />
+ <Column name="MACHINE_VERSION_GUID" />
+ </Columns>
+ </Item>
+ <Item name="dbo.TECH_CONTROLLERS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ <Column name="MIN" />
+ <Column name="MAX" />
+ <Column name="UNITS" />
+ </Columns>
+ </Item>
+ <Item name="dbo.TECH_DISPENSERS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ </Columns>
+ </Item>
+ <Item name="dbo.TECH_HEATERS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ </Columns>
+ </Item>
+ <Item name="dbo.TECH_IOS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="TYPE" />
+ <Column name="DESIGNATOR" />
+ <Column name="ASM" />
+ <Column name="INTERFACE_NAME" />
+ <Column name="SENSOR" />
+ <Column name="INIT_VALUE" />
+ <Column name="AVERAGING" />
+ <Column name="MIN" />
+ <Column name="MAX" />
+ </Columns>
+ </Item>
+ <Item name="dbo.TECH_MONITORS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ <Column name="MIN" />
+ <Column name="MAX" />
+ <Column name="UNITS" />
+ <Column name="POINTS_PER_FRAME" />
+ <Column name="MULTI_CHANNEL" />
+ <Column name="CHANNEL_COUNT" />
+ </Columns>
+ </Item>
+ <Item name="dbo.TECH_VALVES" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ <Column name="TYPE" />
+ <Column name="STATE1" />
+ <Column name="STATE2" />
+ </Columns>
+ </Item>
+ <Item name="dbo.USERS" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="DELETED" />
+ <Column name="EMAIL" />
+ <Column name="PASSWORD" />
+ <Column name="ORGANIZATION_GUID" />
+ <Column name="CONTACT_GUID" />
+ <Column name="ADDRESS_GUID" />
+ <Column name="LAST_LOGIN" />
+ </Columns>
+ </Item>
+ <Item name="dbo.USERS_ROLES" type="table">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="USER_GUID" />
+ <Column name="ROLE_GUID" />
+ </Columns>
+ </Item>
+ <Item name="dbo.WINDING_METHODS" type="table" extracted="True">
+ <Columns>
+ <Column name="GUID" key="true" />
+ <Column name="ID" />
+ <Column name="LAST_UPDATED" />
+ <Column name="CODE" />
+ <Column name="NAME" />
+ <Column name="DESCRIPTION" />
+ </Columns>
+ </Item>
+ </Items>
+ <ProjectSettings>
+ <AllSettings>
+ <ComparisonCaseSensitive>1</ComparisonCaseSensitive>
+ <CompareTrimmedStrings>False</CompareTrimmedStrings>
+ <EmptyEqualsNull>False</EmptyEqualsNull>
+ <PrecedeStringConstWithNPrefix>0</PrecedeStringConstWithNPrefix>
+ <AutoSelectKeyColumns>0</AutoSelectKeyColumns>
+ <PerformanceOptions>
+ <PerformanceOption name="Auto" value="True" />
+ </PerformanceOptions>
+ </AllSettings>
+ </ProjectSettings>
+</SqlDataExaminer> \ No newline at end of file
diff --git a/Software/DB/SQLExaminer Projects/GENERAL_ENV_UPGRADE.seproj b/Software/DB/SQLExaminer Projects/GENERAL_ENV_UPGRADE.seproj
new file mode 100644
index 000000000..797c4ade0
--- /dev/null
+++ b/Software/DB/SQLExaminer Projects/GENERAL_ENV_UPGRADE.seproj
@@ -0,0 +1,72 @@
+<Project version="21">
+ <Sources>
+ <Source id="1">
+ <EngineType>MsSqlAzure</EngineType>
+ <StorageType>LiveDb</StorageType>
+ <ServerName>twine.database.windows.net</ServerName>
+ <Database>Tango_DEV</Database>
+ <WinAuth>False</WinAuth>
+ <AzureAuthMode>SqlServer</AzureAuthMode>
+ <Login>Roy</Login>
+ <Password>Aa123456</Password>
+ <SavePasswords>true</SavePasswords>
+ </Source>
+ <Source id="2">
+ <EngineType>MsSqlAzure</EngineType>
+ <StorageType>LiveDb</StorageType>
+ <ServerName>twine.database.windows.net</ServerName>
+ <Database>Tango_TEST</Database>
+ <WinAuth>False</WinAuth>
+ <AzureAuthMode>SqlServer</AzureAuthMode>
+ <Login>Roy</Login>
+ <Password>Aa123456</Password>
+ <SavePasswords>true</SavePasswords>
+ </Source>
+ </Sources>
+ <DataTypesMappings>
+ <DataTypesMapping name="Default" default="True" />
+ </DataTypesMappings>
+ <ObjectFilter mode="All" />
+ <ProjectOptions>
+ <IgnoreIndices>false</IgnoreIndices>
+ <IgnoreIndexDetails>false</IgnoreIndexDetails>
+ <IgnorePrimaryKeys>false</IgnorePrimaryKeys>
+ <IgnoreUniqueConstraints>false</IgnoreUniqueConstraints>
+ <IgnoreForeignKeys>false</IgnoreForeignKeys>
+ <IgnoreFKAction>false</IgnoreFKAction>
+ <IgnoreChecks>false</IgnoreChecks>
+ <IgnoreFullText>false</IgnoreFullText>
+ <IgnoreWithNocheck>true</IgnoreWithNocheck>
+ <IgnoreNotForReplication>false</IgnoreNotForReplication>
+ <IgnoreFileGroup>false</IgnoreFileGroup>
+ <IgnoreIdentity>false</IgnoreIdentity>
+ <IgnoreComments>true</IgnoreComments>
+ <IgnoreCaseSensitivity>true</IgnoreCaseSensitivity>
+ <IgnoreSpaces>true</IgnoreSpaces>
+ <IgnoreSemicolons>true</IgnoreSemicolons>
+ <IgnoreOwners>false</IgnoreOwners>
+ <IncludeSchemaInScript>true</IncludeSchemaInScript>
+ <IgnoreTriggers>false</IgnoreTriggers>
+ <IgnoreCollations>false</IgnoreCollations>
+ <IgnoreExtProperties>false</IgnoreExtProperties>
+ <IgnorePermissions>false</IgnorePermissions>
+ <IgnoreIndexNames>true</IgnoreIndexNames>
+ <IgnoreNullable>false</IgnoreNullable>
+ <IgnoreColumnsTypes>false</IgnoreColumnsTypes>
+ <IgnoreDefaults>false</IgnoreDefaults>
+ <IgnoreAnsiNulls>false</IgnoreAnsiNulls>
+ <IgnoreQuotedID>false</IgnoreQuotedID>
+ <IgnorePhysicalProperties>false</IgnorePhysicalProperties>
+ <DecryptTextObjects>false</DecryptTextObjects>
+ <SaveOrderOption>true</SaveOrderOption>
+ <UserTypesToBase>false</UserTypesToBase>
+ <CaseSense>false</CaseSense>
+ <IgnoreCaseObjectNames>true</IgnoreCaseObjectNames>
+ </ProjectOptions>
+ <SchemaMapping>
+ <SMItem schema1="guest" schema2="guest" />
+ <SMItem schema1="dbo" schema2="dbo" />
+ <SMItem schema1="sys" schema2="sys" />
+ <SMItem schema1="INFORMATION_SCHEMA" schema2="INFORMATION_SCHEMA" />
+ </SchemaMapping>
+</Project> \ No newline at end of file
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/App.config b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/App.config
index eb51eb63b..2b12e43f8 100644
--- a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/App.config
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/App.config
@@ -9,6 +9,10 @@
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
</dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory" publicKeyToken="31bf3856ad364e35" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
+ </dependentAssembly>
</assemblyBinding>
</runtime>
</configuration> \ No newline at end of file
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/MainWindow.xaml.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/MainWindow.xaml.cs
index c7d1728bd..2ba632f76 100644
--- a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/MainWindow.xaml.cs
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/MainWindow.xaml.cs
@@ -20,9 +20,38 @@ namespace Tango.AzureUtils.UI
/// </summary>
public partial class MainWindow : Window
{
+ private static string app_id = "be33437c-5052-449f-ab9d-a88d008eae24";
+ private static string client_secret = "bf67fb6f-4d06-4893-988c-6b347aff23d6";
+ private static string tenant_id = "2ebd63a5-bc2f-41dc-9066-4409ed5e5dd4";
+ private static string subscription_id = "10c8aa60-3b15-4e0d-b412-6aeef90e5e91";
+
+ Tango.AzureUtils.Deployment.DeploymentManager manager = new Deployment.DeploymentManager(new AzureUtilsCredentials()
+ {
+ ClientID = app_id,
+ ClientSecret = client_secret,
+ TenantID = tenant_id,
+ SubscriptionID = subscription_id
+ });
+
public MainWindow()
{
InitializeComponent();
+
+ Test();
+ }
+
+ private async void Test()
+ {
+ var apps = await manager.GetAllWebAppsAsync();
+
+ var machineService = apps.SingleOrDefault(x => x.Name == "MachineService");
+
+ var devSlot = await machineService.DeploymentSlots.GetByNameAsync("MachineService-DEV");
+ var testSlot = await machineService.DeploymentSlots.GetByNameAsync("MachineService-TEST");
+
+ await manager.OpenSQLExaminerData(devSlot, testSlot);
+
+ var a = 5;
}
}
}
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Tango.AzureUtils.UI.csproj b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Tango.AzureUtils.UI.csproj
index 08d69d41d..c2b723760 100644
--- a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Tango.AzureUtils.UI.csproj
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Tango.AzureUtils.UI.csproj
@@ -227,6 +227,10 @@
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
+ <ProjectReference Include="..\..\Tango.Core\Tango.Core.csproj">
+ <Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project>
+ <Name>Tango.Core</Name>
+ </ProjectReference>
<ProjectReference Include="..\Tango.AzureUtils\Tango.AzureUtils.csproj">
<Project>{4a6b97e5-5eba-4702-a016-6f4004f14b08}</Project>
<Name>Tango.AzureUtils</Name>
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentManager.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentManager.cs
index e9ae6e97b..8a3b6ad7b 100644
--- a/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentManager.cs
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentManager.cs
@@ -1,4 +1,5 @@
-using Microsoft.Azure.Management.AppService.Fluent;
+using FluentFTP;
+using Microsoft.Azure.Management.AppService.Fluent;
using Microsoft.Azure.Management.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent.Authentication;
@@ -6,27 +7,70 @@ using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Blob;
using System;
using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Data.Entity;
+using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using System.Xml;
+using System.Xml.Linq;
+using Tango.BL;
+using Tango.BL.Entities;
+using Tango.Core;
+using Tango.Core.Helpers;
namespace Tango.AzureUtils.Deployment
{
- public class DeploymentManager
+ public class DeploymentManager : ExtendedObject
{
private AzureUtilsCredentials _credentials;
private IAzure _azure;
+ private IProgress<FtpProgress> _ftpDownloadProgress;
+ private IProgress<FtpProgress> _ftpUploadProgress;
+
+ //TODO: Embedded TFP injection to current package!
+
+ #region Events
+
+ public event EventHandler<DeploymentProgressEventArgs> DeploymentProgress;
+
+ #endregion
+
+ #region Properties
+
+ private UpgradeConfiguration _upgradeConfiguration;
+ public UpgradeConfiguration UpgradeConfiguration
+ {
+ get { return _upgradeConfiguration; }
+ set { _upgradeConfiguration = value; RaisePropertyChangedAuto(); }
+ }
+
+ #endregion
+
+ #region Constructors
public DeploymentManager(AzureUtilsCredentials credentials)
{
+ UpgradeConfiguration = new UpgradeConfiguration();
+
_credentials = credentials;
+
+ _ftpDownloadProgress = new Progress<FtpProgress>((p) =>
+ {
+ OnProgress(DeploymentStage.DownloadingFTP, $"Downloading {p.RemotePath}...", p.Progress, 100, false);
+ });
+
+ _ftpUploadProgress = new Progress<FtpProgress>((p) =>
+ {
+ OnProgress(DeploymentStage.UploadingFTP, $"Uploading {p.LocalPath}...", p.Progress, 100, false);
+ });
}
- private static string app_id = "be33437c-5052-449f-ab9d-a88d008eae24";
- private static string client_secret = "bf67fb6f-4d06-4893-988c-6b347aff23d6";
- private static string tenant_id = "2ebd63a5-bc2f-41dc-9066-4409ed5e5dd4";
- private static string subscription_id = "10c8aa60-3b15-4e0d-b412-6aeef90e5e91";
+ #endregion
+
+ #region Authenticate
private IAzure GetOrCreateAzure()
{
@@ -44,56 +88,430 @@ namespace Tango.AzureUtils.Deployment
return _azure;
}
- public List<IWebApp> GetAllWebApps()
+ #endregion
+
+ #region Helpers
+
+ public async Task<List<IWebApp>> GetAllWebAppsAsync()
+ {
+ return (await GetOrCreateAzure().WebApps.ListAsync()).ToList();
+ }
+
+ #endregion
+
+ #region Init
+
+ public void Init()
+ {
+ GetOrCreateAzure();
+ }
+
+ #endregion
+
+ #region Full Upgrade
+
+ public async Task PerformFullUpgrade(IWebAppBase sourceApp, IWebAppBase targetApp)
+ {
+ await ValidateUpgrade(sourceApp, targetApp);
+
+ await UpgradeStorage(sourceApp, targetApp);
+ await UpgradeVersions(sourceApp, targetApp);
+
+ if (UpgradeConfiguration.UpgradeMachineService)
+ {
+ await UpgradeMachineService(sourceApp, targetApp);
+ }
+ }
+
+ #endregion
+
+ #region SQLExaminer
+
+ public async Task OpenSQLExaminerSchema(IWebAppBase sourceApp, IWebAppBase targetApp)
+ {
+ String projectFile = Path.Combine(AssemblyHelper.GetCurrentAssemblyFolder(), "Deployment", "GENERAL_ENV_UPGRADE.seproj");
+
+ using (Stream stream = GetFileStream(projectFile))
+ {
+ XElement projectXml = XElement.Load(stream);
+ var sourceSettings = await sourceApp.GetMachineServiceSettingsAsync();
+ var targetSettings = await targetApp.GetMachineServiceSettingsAsync();
+ ApplyDatabaseSettingsToProjectXml(projectXml, sourceSettings, targetSettings);
+
+ var tempFile = TemporaryManager.CreateImaginaryFile(".seproj");
+ tempFile.Persist = true;
+
+ File.WriteAllText(tempFile, projectXml.ToString());
+
+ Process.Start(tempFile);
+ }
+ }
+
+ public async Task OpenSQLExaminerData(IWebAppBase sourceApp, IWebAppBase targetApp)
+ {
+ String projectFile = Path.Combine(AssemblyHelper.GetCurrentAssemblyFolder(), "Deployment", "GENERAL_ENV_UPGRADE.sdeproj");
+
+ using (Stream stream = GetFileStream(projectFile))
+ {
+ XElement projectXml = XElement.Load(stream);
+ var sourceSettings = await sourceApp.GetMachineServiceSettingsAsync();
+ var targetSettings = await targetApp.GetMachineServiceSettingsAsync();
+ ApplyDatabaseSettingsToProjectXml(projectXml, sourceSettings, targetSettings);
+
+ var tempFile = TemporaryManager.CreateImaginaryFile(".sdeproj");
+ tempFile.Persist = true;
+
+ File.WriteAllText(tempFile, projectXml.ToString());
+
+ Process.Start(tempFile);
+ }
+ }
+
+ private Stream GetFileStream(String projectFile)
+ {
+ byte[] projectBytes = File.ReadAllBytes(projectFile);
+ MemoryStream stream = new MemoryStream(projectBytes);
+ return stream;
+ }
+
+ private void ApplyDatabaseSettingsToProjectXml(XElement projectXml, MachineServiceSettings sourceSettings, MachineServiceSettings targetSettings)
+ {
+ var sourceElement = projectXml.Elements().SelectMany(x => x.Descendants()).SingleOrDefault(x => x.Name == "Source" && x.Attributes().SingleOrDefault(y => y.Name == "id").Value == "1");
+ var targetElement = projectXml.Elements().SelectMany(x => x.Descendants()).SingleOrDefault(x => x.Name == "Source" && x.Attributes().SingleOrDefault(y => y.Name == "id").Value == "2");
+
+ ApplyDatabaseSettingsToSourceElement(sourceElement, sourceSettings);
+ ApplyDatabaseSettingsToSourceElement(targetElement, targetSettings);
+ }
+
+ private void ApplyDatabaseSettingsToSourceElement(XElement sourceElement, MachineServiceSettings settings)
+ {
+ sourceElement.Element("ServerName").SetValue(settings.DB_ADDRESS);
+ sourceElement.Element("Database").SetValue(settings.DB_CATALOG);
+ sourceElement.Element("Login").SetValue(settings.DB_USER_NAME);
+ sourceElement.Element("Password").SetValue(settings.DB_PASSWORD);
+ }
+
+ #endregion
+
+ #region FTP
+
+ private async Task<List<FtpResult>> DownloadWebAppFiles(IWebAppBase app, String targetFolder)
+ {
+ var profile = await app.GetPublishingProfileAsync();
+
+ using (var ftp = new FtpClient(profile.FtpUrl, profile.FtpUsername, profile.FtpPassword))
+ {
+ var downloadResults = await ftp.DownloadDirectoryAsync(targetFolder, "/site/wwwroot", progress: _ftpDownloadProgress);
+
+ foreach (var downloadResult in downloadResults)
+ {
+ if (downloadResult.IsFailed)
+ {
+ throw downloadResult.Exception;
+ }
+ }
+
+ return downloadResults;
+ }
+ }
+
+ private async Task<List<FtpResult>> UploadWebAppFiles(IWebAppBase app, String sourceFolder)
+ {
+ var profile = await app.GetPublishingProfileAsync();
+
+ using (var ftp = new FtpClient(profile.FtpUrl, profile.FtpUsername, profile.FtpPassword))
+ {
+ var uploadResults = await ftp.UploadDirectoryAsync(sourceFolder, "/site/wwwroot", existsMode: FtpRemoteExists.Overwrite, progress: _ftpUploadProgress);
+
+ foreach (var uploadResult in uploadResults)
+ {
+ if (uploadResult.IsFailed)
+ {
+ throw uploadResult.Exception;
+ }
+ }
+
+ return uploadResults;
+ }
+ }
+
+ #endregion
+
+ #region Machine Service
+
+ public async Task UpgradeMachineService(IWebAppBase sourceApp, IWebAppBase targetApp)
+ {
+ var webAppFilesTempFolder = TemporaryManager.CreateFolder();
+ var downloadResults = await DownloadWebAppFiles(sourceApp, webAppFilesTempFolder);
+ var uploadResults = await UploadWebAppFiles(targetApp, webAppFilesTempFolder + "\\wwwroot");
+ }
+
+ #endregion
+
+ #region Applications Versions & Storage Blobs
+
+ public async Task<MachineStudioVersion> GetLatestMachineStudioVersion(IWebAppBase app)
+ {
+ MachineServiceSettings settings = null;
+
+ try
+ {
+ settings = await app.GetMachineServiceSettingsAsync();
+ }
+ catch (Exception ex)
+ {
+ throw new ArgumentException("Could not fetch machine service settings. Please check that all settings are available.");
+ }
+
+ try
+ {
+ DataSource dataSource = settings.ToDataSource();
+
+ using (var db = ObservablesContext.CreateDefault(dataSource))
+ {
+ var versions = await db.MachineStudioVersions.ToListAsync();
+ var latest_machine_version = versions.OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ return latest_machine_version;
+ }
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidDataException("Could not retrieve latest Machine Studio version from database.", ex);
+ }
+ }
+
+ public async Task<TangoVersion> GetLatestPPCVersion(IWebAppBase app)
{
- return GetOrCreateAzure().WebApps.List().ToList();
+ MachineServiceSettings settings = null;
+
+ try
+ {
+ settings = await app.GetMachineServiceSettingsAsync();
+ }
+ catch (Exception ex)
+ {
+ throw new ArgumentException("Could not fetch machine service settings. Please check that all settings are available.", ex);
+ }
+
+ try
+ {
+ DataSource dataSource = settings.ToDataSource();
+
+ using (var db = ObservablesContext.CreateDefault(dataSource))
+ {
+ var versions = await db.TangoVersions.ToListAsync();
+ var latest_machine_version = versions.OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault();
+ return latest_machine_version;
+ }
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidDataException("Could not retrieve latest PPC version from database.", ex);
+ }
}
- public void UpdateSlot(IDeploymentSlot slot)
+ public async Task UpgradeStorage(IWebAppBase sourceApp, IWebAppBase targetApp)
{
-
+ await ValidateUpgrade(sourceApp, targetApp);
+
+ var latestMachineStudioVersion = await GetLatestMachineStudioVersion(sourceApp);
+ var latestPPCVersion = await GetLatestPPCVersion(sourceApp);
+
+ var sourceSettings = await sourceApp.GetMachineServiceSettingsAsync();
+ var targetSettings = await targetApp.GetMachineServiceSettingsAsync();
+
+ var sourceAccount = CloudStorageAccount.Parse(sourceSettings.STORAGE_ACCOUNT);
+ var sourceClient = sourceAccount.CreateCloudBlobClient();
+
+ var targetAccount = CloudStorageAccount.Parse(targetSettings.STORAGE_ACCOUNT);
+ var targetClient = targetAccount.CreateCloudBlobClient();
+
+ var sourceMachineStudioContainer = sourceClient.GetContainerReference(sourceSettings.MACHINE_STUDIO_VERSIONS_CONTAINER);
+ var targetMachineStudioContainer = targetClient.GetContainerReference(targetSettings.MACHINE_STUDIO_VERSIONS_CONTAINER);
+
+ var sourcePPCContainer = sourceClient.GetContainerReference(sourceSettings.TANGO_VERSIONS_CONTAINER);
+ var targetPPCContainer = targetClient.GetContainerReference(targetSettings.TANGO_VERSIONS_CONTAINER);
+
+ var sourceMachineStudioBlob = sourceMachineStudioContainer.GetBlockBlobReference(latestMachineStudioVersion.BlobName);
+ var sourceMachineStudioInstallerBlob = sourceMachineStudioContainer.GetBlockBlobReference(latestMachineStudioVersion.InstallerBlobName);
+
+ var targetMachineStudioBlob = CreateEmptyBlob(targetMachineStudioContainer, sourceMachineStudioBlob.Name);
+ var targetMachineStudioInstallerBlob = CreateEmptyBlob(targetMachineStudioContainer, sourceMachineStudioInstallerBlob.Name);
+
+ await Task.Factory.StartNew(() =>
+ {
+ targetMachineStudioBlob.StartCopy(sourceMachineStudioBlob);
+ targetMachineStudioInstallerBlob.StartCopy(sourceMachineStudioInstallerBlob);
+ });
}
- public void Deploy()
+ public async Task UpgradeVersions(IWebAppBase sourceApp, IWebAppBase targetApp)
{
- var credentials = SdkContext.AzureCredentialsFactory.FromServicePrincipal(
- app_id,
- client_secret,
- tenant_id,
- AzureEnvironment.AzureGlobalCloud);
+ await ValidateUpgrade(sourceApp, targetApp);
+
+ if (UpgradeConfiguration.UpgradeMachineStudio)
+ {
+ await UpgradeMachineStudioVersion(sourceApp, targetApp);
+ }
- var azure = Azure.Authenticate(credentials).WithSubscription(subscription_id);
- var webApps = azure.WebApps.List();
+ if (UpgradeConfiguration.UpgradePPC)
+ {
+ await UpgradePPCVersion(sourceApp, targetApp);
+ }
+ }
- var machineService = webApps.SingleOrDefault(x => x.Name == "MachineService");
- var devSlot = machineService.DeploymentSlots.GetByName("MachineService-DEV");
- var devProfile = devSlot.GetPublishingProfile();
+ private async Task UpgradeMachineStudioVersion(IWebAppBase sourceApp, IWebAppBase targetApp)
+ {
+ var latestMachineStudioVersion = await GetLatestMachineStudioVersion(sourceApp);
- String ftpAddress = devProfile.FtpUrl;
- String ftpUser = devProfile.FtpUsername;
- String ftpPassword = devProfile.FtpPassword;
+ var targetDataSource = (await targetApp.GetMachineServiceSettingsAsync()).ToDataSource();
- foreach (var ds in machineService.DeploymentSlots.List())
+ using (var db = ObservablesContext.CreateDefault(targetDataSource))
{
- Console.WriteLine(ds.Name);
+ db.MachineStudioVersions.Add(latestMachineStudioVersion);
+ await db.SaveChangesAsync();
}
+ }
- CloudStorageAccount sourceAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=tangostorage;AccountKey=S4z/D+Yg6mwMis+bs/VpcDLA9yE1iZaYq23shQlRIi2KmM9E7JY8zdZjeAPOPdG3gONHoNDEpsgH6D4cqQ/bsA==;EndpointSuffix=core.windows.net");
- CloudBlobClient sourceClient = sourceAccount.CreateCloudBlobClient();
+ private async Task UpgradePPCVersion(IWebAppBase sourceApp, IWebAppBase targetApp)
+ {
+ var latestPPCVersion = await GetLatestPPCVersion(sourceApp);
- var sourceContainer = sourceClient.GetContainerReference("machine-studio-versions-test");
- var sourceBlob = sourceContainer.GetBlockBlobReference("Machine Studio v4.0.34.0.zip");
+ var targetDataSource = (await targetApp.GetMachineServiceSettingsAsync()).ToDataSource();
- var targetContainer = sourceClient.GetContainerReference("machine-studio-versions-dev");
+ using (var db = ObservablesContext.CreateDefault(targetDataSource))
+ {
+ db.TangoVersions.Add(latestPPCVersion);
+ await db.SaveChangesAsync();
+ }
+ }
- CloudBlockBlob targetBlob = targetContainer.GetBlockBlobReference(sourceBlob.Name);
+ private CloudBlockBlob CreateEmptyBlob(CloudBlobContainer container, String name)
+ {
+ CloudBlockBlob targetBlob = container.GetBlockBlobReference(name);
using (MemoryStream ms = new MemoryStream())
{
targetBlob.UploadFromStream(ms);//Empty memory stream. Will create an empty blob.
}
- targetBlob.StartCopy(sourceBlob);
+ return targetBlob;
+ }
+
+ #endregion
+
+ #region Validation
+
+ public async Task ValidateUpgrade(IWebAppBase sourceApp, IWebAppBase targetApp)
+ {
+ if (UpgradeConfiguration.UpgradeMachineStudio)
+ {
+ await ValidateMachineStudioUpgrade(sourceApp, targetApp);
+ }
+
+ if (UpgradeConfiguration.UpgradePPC)
+ {
+ await ValidatePPCUpgrade(sourceApp, targetApp);
+ }
+ }
+
+ private async Task ValidateMachineStudioUpgrade(IWebAppBase sourceApp, IWebAppBase targetApp)
+ {
+ var sourceSettings = await sourceApp.GetMachineServiceSettingsAsync();
+ var targetSettings = await targetApp.GetMachineServiceSettingsAsync();
+
+ var latestSourceMachineStudioVersion = await GetLatestMachineStudioVersion(sourceApp);
+
+ //Check if there is any source machine studio version.
+ if (latestSourceMachineStudioVersion == null)
+ {
+ throw new ValidationException("Could not locate a Machine Studio version entry on the source database.");
+ }
+
+ var latestTargetMachineStudioVersion = await GetLatestMachineStudioVersion(targetApp);
+
+ //Check target latest machine studio version is older if there is any.
+ if (latestTargetMachineStudioVersion != null && Version.Parse(latestSourceMachineStudioVersion.Version) <= Version.Parse(latestTargetMachineStudioVersion.Version))
+ {
+ throw new ValidationException($"Machine Studio source version is '{latestSourceMachineStudioVersion.Version}' while target version is '{latestTargetMachineStudioVersion.Version}'.");
+ }
+
+ var targetAccount = CloudStorageAccount.Parse(targetSettings.STORAGE_ACCOUNT);
+ var targetClient = targetAccount.CreateCloudBlobClient();
+
+ var targetMachineStudioContainer = targetClient.GetContainerReference(targetSettings.MACHINE_STUDIO_VERSIONS_CONTAINER);
+
+ //Check machine studio binaries blob not exists on the target.
+ var targetMachineStudioBlob = targetMachineStudioContainer.GetBlockBlobReference(latestSourceMachineStudioVersion.BlobName);
+ if (await targetMachineStudioBlob.ExistsAsync())
+ {
+ throw new ValidationException($"Machine Studio Block blob '{latestSourceMachineStudioVersion.BlobName}' already exists on the target storage.");
+ }
+
+ //Check machine studio installer blob not exists on the target.
+ var targetMachineStudioInstallerBlob = targetMachineStudioContainer.GetBlockBlobReference(latestSourceMachineStudioVersion.InstallerBlobName);
+ if (await targetMachineStudioInstallerBlob.ExistsAsync())
+ {
+ throw new ValidationException($"Machine Studio Block blob '{latestSourceMachineStudioVersion.InstallerBlobName}' already exists on the target storage.");
+ }
+ }
+
+ private async Task ValidatePPCUpgrade(IWebAppBase sourceApp, IWebAppBase targetApp)
+ {
+ var sourceSettings = await sourceApp.GetMachineServiceSettingsAsync();
+ var targetSettings = await targetApp.GetMachineServiceSettingsAsync();
+
+ var latestSourcePPCVersion = await GetLatestPPCVersion(sourceApp);
+
+ //Check if there is any source PPC version.
+ if (latestSourcePPCVersion == null)
+ {
+ throw new ValidationException("Could not locate a PPC version entry on the source database.");
+ }
+
+ var latestTargetPPCVersion = await GetLatestPPCVersion(targetApp);
+
+ //Check target latest PPC version is older if there is any.
+ if (latestTargetPPCVersion != null && Version.Parse(latestSourcePPCVersion.Version) <= Version.Parse(latestTargetPPCVersion.Version))
+ {
+ throw new ValidationException($"PPC source version is '{latestSourcePPCVersion.Version}' while target version is '{latestTargetPPCVersion.Version}'.");
+ }
+
+ var targetAccount = CloudStorageAccount.Parse(targetSettings.STORAGE_ACCOUNT);
+ var targetClient = targetAccount.CreateCloudBlobClient();
+
+ var targetPPCContainer = targetClient.GetContainerReference(targetSettings.TANGO_VERSIONS_CONTAINER);
+
+ //Check PPC binaries blob not exists on the target.
+ var targetPPCBlob = targetPPCContainer.GetBlockBlobReference(latestSourcePPCVersion.BlobName);
+ if (await targetPPCBlob.ExistsAsync())
+ {
+ throw new ValidationException($"PPC Block blob '{latestSourcePPCVersion.BlobName}' already exists on the target storage.");
+ }
+
+ //Check PPC installer blob not exists on the target.
+ var targetPPCInstallerBlob = targetPPCContainer.GetBlockBlobReference(latestSourcePPCVersion.InstallerBlobName);
+ if (await targetPPCInstallerBlob.ExistsAsync())
+ {
+ throw new ValidationException($"PPC Block blob '{latestSourcePPCVersion.InstallerBlobName}' already exists on the target storage.");
+ }
+ }
+
+ #endregion
+
+ #region Virtual Methods
+
+ protected virtual void OnProgress(DeploymentStage stage, String message = null, double progress = 0, double maximum = 100, bool indeterminate = true)
+ {
+ DeploymentProgress?.Invoke(this, new DeploymentProgressEventArgs()
+ {
+ Stage = stage,
+ Message = message,
+ Progress = progress,
+ Maximum = maximum,
+ IsIndeterminate = indeterminate,
+ });
}
+ #endregion
}
}
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentProgressEventArgs.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentProgressEventArgs.cs
new file mode 100644
index 000000000..5fe166464
--- /dev/null
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentProgressEventArgs.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.AzureUtils.Deployment
+{
+ public class DeploymentProgressEventArgs : EventArgs
+ {
+ public DeploymentStage Stage { get; set; }
+ public double Progress { get; set; }
+ public double Maximum { get; set; }
+ public bool IsIndeterminate { get; set; }
+ public String Message { get; set; }
+ }
+}
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentStage.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentStage.cs
new file mode 100644
index 000000000..531a1ed8c
--- /dev/null
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentStage.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.AzureUtils.Deployment
+{
+ public enum DeploymentStage
+ {
+ Ready,
+ Initializing,
+ DownloadingFTP,
+ UploadingFTP,
+ }
+}
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/ExtensionMethods.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/ExtensionMethods.cs
index 6b57ce53a..b9437e49e 100644
--- a/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/ExtensionMethods.cs
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/ExtensionMethods.cs
@@ -5,14 +5,15 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.AzureUtils.Deployment;
+using Tango.Core;
public static class ExtensionMethods
{
- public static MachineServiceSettings GetMachineServiceSettings(this IWebAppBase app)
+ public static async Task<MachineServiceSettings> GetMachineServiceSettingsAsync(this IWebAppBase app)
{
MachineServiceSettings settings = new MachineServiceSettings();
- var s = app.GetAppSettings();
+ var s = await app.GetAppSettingsAsync();
settings.DB_ADDRESS = s[nameof(MachineServiceSettings.DB_ADDRESS)].Value;
settings.DB_CATALOG = s[nameof(MachineServiceSettings.DB_CATALOG)].Value;
@@ -24,4 +25,17 @@ public static class ExtensionMethods
return settings;
}
+
+ public static DataSource ToDataSource(this MachineServiceSettings settings)
+ {
+ DataSource dataSource = new DataSource();
+ dataSource.Type = DataSourceType.SQLServer;
+ dataSource.Address = settings.DB_ADDRESS;
+ dataSource.Catalog = settings.DB_CATALOG;
+ dataSource.UserName = settings.DB_USER_NAME;
+ dataSource.Password = settings.DB_PASSWORD;
+ dataSource.IntegratedSecurity = false;
+
+ return dataSource;
+ }
}
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/UpgradeConfiguration.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/UpgradeConfiguration.cs
new file mode 100644
index 000000000..233034d0d
--- /dev/null
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/UpgradeConfiguration.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.AzureUtils.Deployment
+{
+ public class UpgradeConfiguration
+ {
+ public bool UpgradeMachineService { get; set; }
+ public bool UpgradeMachineStudio { get; set; }
+ public bool UpgradePPC { get; set; }
+ }
+}
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Tango.AzureUtils.csproj b/Software/Visual_Studio/Azure/Tango.AzureUtils/Tango.AzureUtils.csproj
index 7643f389c..d3dc6a69f 100644
--- a/Software/Visual_Studio/Azure/Tango.AzureUtils/Tango.AzureUtils.csproj
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Tango.AzureUtils.csproj
@@ -31,6 +31,15 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
+ <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+ <HintPath>..\..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll</HintPath>
+ </Reference>
+ <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+ <HintPath>..\..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll</HintPath>
+ </Reference>
+ <Reference Include="FluentFTP, Version=30.0.0.0, Culture=neutral, PublicKeyToken=f4af092b1d8df44f, processorArchitecture=MSIL">
+ <HintPath>..\..\packages\FluentFTP.30.0.0\lib\net45\FluentFTP.dll</HintPath>
+ </Reference>
<Reference Include="Hyak.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Hyak.Common.1.2.2\lib\net452\Hyak.Common.dll</HintPath>
</Reference>
@@ -155,6 +164,7 @@
<HintPath>..\..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
+ <Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.IdentityModel" />
@@ -163,6 +173,7 @@
<Reference Include="System.Runtime" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Security" />
+ <Reference Include="System.Web" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
@@ -174,13 +185,34 @@
<ItemGroup>
<Compile Include="AzureUtilsCredentials.cs" />
<Compile Include="Deployment\DeploymentManager.cs" />
+ <Compile Include="Deployment\DeploymentProgressEventArgs.cs" />
+ <Compile Include="Deployment\DeploymentStage.cs" />
<Compile Include="Deployment\ExtensionMethods.cs" />
<Compile Include="Deployment\MachineServiceSettings.cs" />
+ <Compile Include="Deployment\UpgradeConfiguration.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
+ <Content Include="..\..\..\DB\SQLExaminer Projects\GENERAL_ENV_UPGRADE.sdeproj">
+ <Link>Deployment\GENERAL_ENV_UPGRADE.sdeproj</Link>
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
+ <Content Include="..\..\..\DB\SQLExaminer Projects\GENERAL_ENV_UPGRADE.seproj">
+ <Link>Deployment\GENERAL_ENV_UPGRADE.seproj</Link>
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\Tango.BL\Tango.BL.csproj">
+ <Project>{f441feee-322a-4943-b566-110e12fd3b72}</Project>
+ <Name>Tango.BL</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\Tango.Core\Tango.Core.csproj">
+ <Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project>
+ <Name>Tango.Core</Name>
+ </ProjectReference>
+ </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project> \ No newline at end of file
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/app.config b/Software/Visual_Studio/Azure/Tango.AzureUtils/app.config
index dde2c3cc6..0c152335c 100644
--- a/Software/Visual_Studio/Azure/Tango.AzureUtils/app.config
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/app.config
@@ -1,11 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
+ <configSections>
+ <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
+ <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+ </configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
</dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory" publicKeyToken="31bf3856ad364e35" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
+ </dependentAssembly>
</assemblyBinding>
</runtime>
+ <entityFramework>
+ <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
+ <providers>
+ <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
+ </providers>
+ </entityFramework>
</configuration> \ No newline at end of file
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/packages.config b/Software/Visual_Studio/Azure/Tango.AzureUtils/packages.config
index 9f49cc92c..9d0723d02 100644
--- a/Software/Visual_Studio/Azure/Tango.AzureUtils/packages.config
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/packages.config
@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
+ <package id="EntityFramework" version="6.2.0" targetFramework="net461" />
+ <package id="FluentFTP" version="30.0.0" targetFramework="net461" />
<package id="Hyak.Common" version="1.2.2" targetFramework="net461" />
<package id="Microsoft.Azure.Common" version="2.2.1" targetFramework="net461" />
<package id="Microsoft.Azure.KeyVault" version="3.0.1" targetFramework="net461" />