aboutsummaryrefslogtreecommitdiffstats
path: root/Software
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2020-02-06 01:19:06 +0200
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2020-02-06 01:19:06 +0200
commitc210f8d477af51fd70af0901315a48e193568059 (patch)
tree2ceda8036375cedf39bed1ccd652a9d89d2997f0 /Software
parent42f6e5e39ba83531adf8712155ca0015346bd662 (diff)
downloadTango-c210f8d477af51fd70af0901315a48e193568059.tar.gz
Tango-c210f8d477af51fd70af0901315a48e193568059.zip
Working on azure utils...
Diffstat (limited to 'Software')
-rw-r--r--Software/DB/SQLExaminer Projects/GENERAL_ENV_CREATE.sdeproj1121
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils.UI/ViewModels/EnvironmentCreationViewVM.cs29
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Views/EnvironmentCreationView.xaml5
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/AzureUtilsComponentBase.cs39
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/AzureUtilsConfirmationEventArgs.cs36
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/AzureUtilsStage.cs14
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentManager.cs19
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentManager.cs166
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Tango.AzureUtils.csproj9
9 files changed, 1394 insertions, 44 deletions
diff --git a/Software/DB/SQLExaminer Projects/GENERAL_ENV_CREATE.sdeproj b/Software/DB/SQLExaminer Projects/GENERAL_ENV_CREATE.sdeproj
new file mode 100644
index 000000000..83146f3b8
--- /dev/null
+++ b/Software/DB/SQLExaminer Projects/GENERAL_ENV_CREATE.sdeproj
@@ -0,0 +1,1121 @@
+<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>
+ <AzurePwd>False</AzurePwd>
+ <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>
+ <AzurePwd>False</AzurePwd>
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" 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.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" extracted="True">
+ <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" extracted="True">
+ <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" />
+ <Column name="JOB_LENGTH" />
+ <Column name="LIQUID_QUANTITY_STRING" />
+ </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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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" extracted="True">
+ <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>
+ <SchemaMapping>
+ <SMItem schema1="dbo" schema2="dbo" />
+ </SchemaMapping>
+ <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/Visual_Studio/Azure/Tango.AzureUtils.UI/ViewModels/EnvironmentCreationViewVM.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/ViewModels/EnvironmentCreationViewVM.cs
index 5a1fa8cca..74995c16d 100644
--- a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/ViewModels/EnvironmentCreationViewVM.cs
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/ViewModels/EnvironmentCreationViewVM.cs
@@ -4,6 +4,7 @@ using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using System.Windows;
using Microsoft.Azure.Management.AppService.Fluent;
using Microsoft.Azure.Management.Fluent;
using Tango.AzureUtils.ActiveDirectory;
@@ -33,7 +34,7 @@ namespace Tango.AzureUtils.UI.ViewModels
}
private String _slotName;
- [Required]
+ [Required(ErrorMessage = "Deployment slot name is required.")]
public String SlotName
{
get { return _slotName; }
@@ -41,8 +42,8 @@ namespace Tango.AzureUtils.UI.ViewModels
}
private String _email;
- [Required]
- [EmailAddress]
+ [Required(ErrorMessage = "Active directory email is required.")]
+ [EmailAddress(ErrorMessage = "Please enter a valid email.")]
public String Email
{
get { return _email; }
@@ -50,7 +51,7 @@ namespace Tango.AzureUtils.UI.ViewModels
}
private String _password;
- [Required]
+ [Required(ErrorMessage = "Password is required.")]
public String Password
{
get { return _password; }
@@ -67,8 +68,6 @@ namespace Tango.AzureUtils.UI.ViewModels
public override void OnApplicationReady()
{
Email = "roy@twine-s.com";
- Password = "1Creativity";
- SlotName = "ROY";
}
public override void OnAuthenticated(IAzure azure, List<IWebAppBase> apps)
@@ -77,7 +76,21 @@ namespace Tango.AzureUtils.UI.ViewModels
DeploymentSlots = apps.OfType<IDeploymentSlot>().Where(x => x.Parent == _machineServiceApp).ToList();
SelectedDeploymentSlot = DeploymentSlots.FirstOrDefault();
- _environmentManager = new EnvironmentManager(azure, new ActiveDirectoryManager(azure, AzureUtilsAuthenticationFactory.GetCredentials()));
+ _environmentManager = new EnvironmentManager(azure);
+ _environmentManager.ConfirmationRequired += _environmentManager_ConfirmationRequired;
+ _environmentManager.Progress += (x, e) => StatusManager.UpdateStatus(e);
+ }
+
+ private void _environmentManager_ConfirmationRequired(object sender, AzureUtilsConfirmationEventArgs e)
+ {
+ if (MessageBox.Show(e.Message, "Confirmation Required", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.OK)
+ {
+ e.Confirm();
+ }
+ else
+ {
+ e.Cancel();
+ }
}
private async void CreateDeploymentSlot()
@@ -87,9 +100,7 @@ namespace Tango.AzureUtils.UI.ViewModels
if (!Validate()) return;
IsFree = false;
- StatusManager.UpdateStatus(AzureUtilsStage.Creating, "Creating new deployment slot...", true);
await _environmentManager.CreateDeploymentSlot(_machineServiceApp as IWebApp, SelectedDeploymentSlot, SlotName, Email, Password);
- StatusManager.UpdateStatus(AzureUtilsStage.Ready, "Deployment slot created successfully.");
}
catch (Exception ex)
{
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Views/EnvironmentCreationView.xaml b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Views/EnvironmentCreationView.xaml
index 4c899bf2d..c7278e2da 100644
--- a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Views/EnvironmentCreationView.xaml
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Views/EnvironmentCreationView.xaml
@@ -4,6 +4,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:vm="clr-namespace:Tango.AzureUtils.UI.ViewModels"
+ xmlns:helpers="clr-namespace:Tango.SharedUI.Helpers;assembly=Tango.SharedUI"
xmlns:global="clr-namespace:Tango.AzureUtils.UI"
xmlns:local="clr-namespace:Tango.AzureUtils.UI.Views"
mc:Ignorable="d"
@@ -34,9 +35,9 @@
<TextBox Margin="0 2 0 0" FontSize="20" Text="{Binding Email}"></TextBox>
<TextBlock Margin="0 10 0 0">Password</TextBlock>
- <TextBox Margin="0 2 0 0" FontSize="20" Text="{Binding Password}"></TextBox>
+ <PasswordBox Margin="0 2 0 0" FontSize="20" helpers:PasswordHelper.Attach="True" helpers:PasswordHelper.Password="{Binding Password,Mode=TwoWay}"></PasswordBox>
- <Button Margin="0 40 0 0" Padding="20" Command="{Binding CreateDeploymentSlotCommand}">CREATE DEPLOYMENT SLOT</Button>
+ <Button Margin="0 40 0 0" Padding="20" Command="{Binding CreateDeploymentSlotCommand}">CREATE ENVIRONMENT</Button>
</StackPanel>
</Grid>
</Grid>
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/AzureUtilsComponentBase.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/AzureUtilsComponentBase.cs
index 507c9adbc..5ad584cd7 100644
--- a/Software/Visual_Studio/Azure/Tango.AzureUtils/AzureUtilsComponentBase.cs
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/AzureUtilsComponentBase.cs
@@ -5,6 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core;
+using Tango.Logging;
namespace Tango.AzureUtils
{
@@ -13,6 +14,7 @@ namespace Tango.AzureUtils
protected IAzure Azure { get; private set; }
public event EventHandler<AzureUtilsProgressEventArgs> Progress;
+ public event EventHandler<AzureUtilsConfirmationEventArgs> ConfirmationRequired;
public AzureUtilsComponentBase(IAzure azure)
{
@@ -21,6 +23,8 @@ namespace Tango.AzureUtils
protected virtual void OnProgress(AzureUtilsStage stage, String message = null, double progress = 0, double maximum = 100, bool indeterminate = true)
{
+ LogManager.Log($"{stage}: {message}");
+
Progress?.Invoke(this, new AzureUtilsProgressEventArgs()
{
Stage = stage,
@@ -30,5 +34,40 @@ namespace Tango.AzureUtils
IsIndeterminate = indeterminate,
});
}
+
+ protected virtual void OnProgress(AzureUtilsProgressEventArgs e)
+ {
+ Progress?.Invoke(this, e);
+ }
+
+ protected async Task<bool> RequestConfirmation(String message, bool throwIfCancel = true)
+ {
+ LogManager.Log($"Confirmation Required: {message}");
+
+ AzureUtilsConfirmationEventArgs e = new AzureUtilsConfirmationEventArgs(message);
+ if (ConfirmationRequired != null)
+ {
+ OnProgress(AzureUtilsStage.ConfirmationRequired, "Waiting for user confirmation...");
+
+ OnRequestConfirmation(e);
+ var result = await e.GetAwaiter();
+
+ if (!result)
+ {
+ throw new OperationCanceledException("Operation canceled.");
+ }
+
+ return result;
+ }
+ else
+ {
+ return true;
+ }
+ }
+
+ protected void OnRequestConfirmation(AzureUtilsConfirmationEventArgs e)
+ {
+ ConfirmationRequired?.Invoke(this, e);
+ }
}
}
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/AzureUtilsConfirmationEventArgs.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/AzureUtilsConfirmationEventArgs.cs
new file mode 100644
index 000000000..9a27e06de
--- /dev/null
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/AzureUtilsConfirmationEventArgs.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.AzureUtils
+{
+ public class AzureUtilsConfirmationEventArgs : EventArgs
+ {
+ private TaskCompletionSource<bool> _completionSource;
+
+ public String Message { get; set; }
+
+ public AzureUtilsConfirmationEventArgs(String message)
+ {
+ Message = message;
+ _completionSource = new TaskCompletionSource<bool>();
+ }
+
+ internal Task<bool> GetAwaiter()
+ {
+ return _completionSource.Task;
+ }
+
+ public void Confirm()
+ {
+ _completionSource.SetResult(true);
+ }
+
+ public void Cancel()
+ {
+ _completionSource.SetResult(false);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/AzureUtilsStage.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/AzureUtilsStage.cs
index 3364dc8c7..994ada3aa 100644
--- a/Software/Visual_Studio/Azure/Tango.AzureUtils/AzureUtilsStage.cs
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/AzureUtilsStage.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -12,12 +13,21 @@ namespace Tango.AzureUtils
Initializing,
Error,
Validating,
+ [Description("Confirmation Required")]
+ ConfirmationRequired,
//Deployment
- DownloadingFTP,
- UploadingFTP,
+ Downloading,
+ Uploading,
//Environment
Creating,
+
+ [Description("Environment Group")]
+ EnvironmentGroup,
+ [Description("Deployment Slot")]
+ DeploymentSlot,
+ Database,
+ Storage,
}
}
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentManager.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentManager.cs
index 3c27d8e01..2500b293c 100644
--- a/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentManager.cs
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Deployment/DeploymentManager.cs
@@ -51,12 +51,12 @@ namespace Tango.AzureUtils.Deployment
_ftpDownloadProgress = new Progress<FtpProgress>((p) =>
{
- OnProgress(AzureUtilsStage.DownloadingFTP, $"Downloading {p.RemotePath}...", p.Progress, 100, false);
+ OnProgress(AzureUtilsStage.Downloading, $"Downloading {p.RemotePath}...", p.Progress, 100, false);
});
_ftpUploadProgress = new Progress<FtpProgress>((p) =>
{
- OnProgress(AzureUtilsStage.UploadingFTP, $"Uploading {p.LocalPath}...", p.Progress, 100, false);
+ OnProgress(AzureUtilsStage.Uploading, $"Uploading {p.LocalPath}...", p.Progress, 100, false);
});
}
@@ -77,6 +77,8 @@ namespace Tango.AzureUtils.Deployment
{
await ValidateUpgrade(sourceApp, targetApp);
+ await OpenSQLExaminerSchema(sourceApp, targetApp);
+ await OpenSQLExaminerData(sourceApp, targetApp);
await UpgradeStorage(sourceApp, targetApp);
await UpgradeVersions(sourceApp, targetApp);
@@ -107,13 +109,21 @@ namespace Tango.AzureUtils.Deployment
File.WriteAllText(tempFile, projectXml.ToString());
Process.Start(tempFile);
+
+ await RequestConfirmation($"Please synchronize the database schema between '{sourceSettings.DB_CATALOG}' and '{targetSettings.DB_CATALOG}'.\nPlease confirm in order to continue.");
+ OnProgress(AzureUtilsStage.Database, $"Waiting for database schema synchronization...");
}
}
- public async Task OpenSQLExaminerData(IWebAppBase sourceApp, IWebAppBase targetApp)
+ public async Task OpenSQLExaminerData(IWebAppBase sourceApp, IWebAppBase targetApp, bool forCreation = false)
{
String projectFile = Path.Combine(AssemblyHelper.GetCurrentAssemblyFolder(), "Deployment", "GENERAL_ENV_UPGRADE.sdeproj");
+ if (forCreation)
+ {
+ projectFile = Path.Combine(AssemblyHelper.GetCurrentAssemblyFolder(), "Deployment", "GENERAL_ENV_CREATE.sdeproj");
+ }
+
using (Stream stream = GetFileStream(projectFile))
{
XElement projectXml = XElement.Load(stream);
@@ -127,6 +137,9 @@ namespace Tango.AzureUtils.Deployment
File.WriteAllText(tempFile, projectXml.ToString());
Process.Start(tempFile);
+
+ await RequestConfirmation($"Please synchronize the database static collections between '{sourceSettings.DB_CATALOG}' and '{targetSettings.DB_CATALOG}'.\nPlease confirm in order to continue.");
+ OnProgress(AzureUtilsStage.Database, $"Waiting for database static collections synchronization...");
}
}
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentManager.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentManager.cs
index c7e48fab1..822813742 100644
--- a/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentManager.cs
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentManager.cs
@@ -11,6 +11,8 @@ using Microsoft.Azure.Management.Sql.Fluent.Models;
using Microsoft.WindowsAzure.Storage;
using Tango.AzureUtils.ActiveDirectory;
using Tango.AzureUtils.Deployment;
+using Tango.BL;
+using Tango.Core;
using Tango.Core.DB;
namespace Tango.AzureUtils.Environment
@@ -18,88 +20,196 @@ namespace Tango.AzureUtils.Environment
public class EnvironmentManager : AzureUtilsComponentBase
{
private ActiveDirectoryManager _adManager;
+ private DeploymentManager _deploymentManager;
- public EnvironmentManager(IAzure azure, ActiveDirectoryManager activeDirectoryManager) : base(azure)
+ public EnvironmentManager(IAzure azure) : base(azure)
{
- _adManager = activeDirectoryManager;
+ _adManager = new ActiveDirectoryManager(azure, AzureUtilsAuthenticationFactory.GetCredentials());
+ _adManager.ConfirmationRequired += (x, e) => OnRequestConfirmation(e);
+ _adManager.Progress += (x, e) => OnProgress(e);
+
+ _deploymentManager = new DeploymentManager(azure);
+ _deploymentManager.ConfirmationRequired += (x, e) => OnRequestConfirmation(e);
+ _deploymentManager.Progress += (x, e) => OnProgress(e);
}
#region Deployment Slots
- public async Task<IDeploymentSlot> CreateDeploymentSlot(IWebApp app, IDeploymentSlot existingSlot, String name, String adEmail, String adPassword)
+ public async Task<IDeploymentSlot> CreateDeploymentSlot(IWebApp app, IDeploymentSlot sourceSlot, String name, String adEmail, String adPassword)
{
- var settings = await existingSlot.GetMachineServiceSettingsAsync();
-
String dbCatalog = $"Tango_{name}";
String machineStudioContainerName = $"machine-studio-versions-{name.ToLower()}";
String ppcContainerName = $"tango-versions-{name.ToLower()}";
String machineServiceBackupsContainerName = $"machine-service-backups-{name.ToLower()}";
String machineServiceLogsContainerName = $"machine-service-logs-{name.ToLower()}";
String environmentGroupName = $"Tango {name}";
+ String slotName = app.Name + "-" + name;
+ OnProgress(AzureUtilsStage.Initializing, $"Retrieving '{sourceSlot.Name}' settings...");
+ var settings = await sourceSlot.GetMachineServiceSettingsAsync();
+
+ OnProgress(AzureUtilsStage.EnvironmentGroup, $"Authenticating with active directory graph...");
await _adManager.Authenticate(adEmail, adPassword);
if (!await _adManager.IsGroupExists(environmentGroupName))
{
+ OnProgress(AzureUtilsStage.EnvironmentGroup, $"Creating environment group '{environmentGroupName}'...");
await _adManager.AddGroup(environmentGroupName);
+
+ OnProgress(AzureUtilsStage.EnvironmentGroup, $"Adding environment group user '{adEmail}'...");
await _adManager.AddUserToGroup(environmentGroupName, adEmail);
}
+ else
+ {
+ await RequestConfirmation($"Environment group '{environmentGroupName}' already exists. Do you wish to continue?");
+ }
- return new object() as IDeploymentSlot;
+ OnProgress(AzureUtilsStage.DeploymentSlot, $"Checking '{app.Name}' deployment slots...");
+ IDeploymentSlot slot = (await app.DeploymentSlots.ListAsync()).ToList().SingleOrDefault(x => x.Name == slotName);
+
+ if (slot == null)
+ {
+ //Add Slot
+ OnProgress(AzureUtilsStage.DeploymentSlot, $"Creating new deployment slot '{slotName}'...");
- var dictionary = new Dictionary<string, string>();
- dictionary.Add(nameof(MachineServiceSettings.DB_ADDRESS), settings.DB_ADDRESS);
- dictionary.Add(nameof(MachineServiceSettings.DB_CATALOG), dbCatalog);
- dictionary.Add(nameof(MachineServiceSettings.DB_PASSWORD), settings.DB_PASSWORD);
- dictionary.Add(nameof(MachineServiceSettings.DB_USER_NAME), settings.DB_USER_NAME);
- dictionary.Add(nameof(MachineServiceSettings.DEPLOYMENT_SLOT), name);
- dictionary.Add(nameof(MachineServiceSettings.ENFORCE_MACHINE_STUDIO_VERSION), settings.ENFORCE_MACHINE_STUDIO_VERSION);
- dictionary.Add(nameof(MachineServiceSettings.ENVIRONMENT_GROUP), environmentGroupName);
- dictionary.Add(nameof(MachineServiceSettings.STORAGE_ACCOUNT), settings.STORAGE_ACCOUNT);
- dictionary.Add(nameof(MachineServiceSettings.MACHINE_STUDIO_VERSIONS_CONTAINER), machineStudioContainerName);
- dictionary.Add(nameof(MachineServiceSettings.TANGO_VERSIONS_CONTAINER), ppcContainerName);
+ var dictionary = new Dictionary<string, string>();
+ dictionary.Add(nameof(MachineServiceSettings.DB_ADDRESS), settings.DB_ADDRESS);
+ dictionary.Add(nameof(MachineServiceSettings.DB_CATALOG), dbCatalog);
+ dictionary.Add(nameof(MachineServiceSettings.DB_PASSWORD), settings.DB_PASSWORD);
+ dictionary.Add(nameof(MachineServiceSettings.DB_USER_NAME), settings.DB_USER_NAME);
+ dictionary.Add(nameof(MachineServiceSettings.DEPLOYMENT_SLOT), name);
+ dictionary.Add(nameof(MachineServiceSettings.ENFORCE_MACHINE_STUDIO_VERSION), settings.ENFORCE_MACHINE_STUDIO_VERSION);
+ dictionary.Add(nameof(MachineServiceSettings.ENVIRONMENT_GROUP), environmentGroupName);
+ dictionary.Add(nameof(MachineServiceSettings.STORAGE_ACCOUNT), settings.STORAGE_ACCOUNT);
+ dictionary.Add(nameof(MachineServiceSettings.MACHINE_STUDIO_VERSIONS_CONTAINER), machineStudioContainerName);
+ dictionary.Add(nameof(MachineServiceSettings.TANGO_VERSIONS_CONTAINER), ppcContainerName);
- //Add Slot
- var slot = await app.DeploymentSlots
- .Define(app.Name + "-" + name)
+ slot = await app.DeploymentSlots
+ .Define(slotName)
.WithBrandNewConfiguration()
.WithWebAppAlwaysOn(true)
.WithWebSocketsEnabled(true)
.WithStickyAppSettings(dictionary)
.WithStickyConnectionString(dbCatalog, $"Server=tcp:twine.database.windows.net,1433;Initial Catalog={dbCatalog};Persist Security Info=False;User ID=BackupUser;Password=Aa123456;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;", Microsoft.Azure.Management.AppService.Fluent.Models.ConnectionStringType.SQLAzure)
.CreateAsync();
+ }
+ else
+ {
+ await RequestConfirmation($"Deployment slot '{slotName}' already exists. Do you wish to continue.");
+ }
//Add Database
+ OnProgress(AzureUtilsStage.Database, $"Checking twine database server...");
var sqlServer = (await Azure.SqlServers.ListAsync()).SingleOrDefault(x => x.Name == "twine");
- var database = await sqlServer.Databases.Define(dbCatalog).WithEdition(DatabaseEdition.Standard).CreateAsync();
+ var existingDatabase = (await sqlServer.Databases.ListAsync()).SingleOrDefault(x => x.Name == dbCatalog);
+
+ if (existingDatabase == null)
+ {
+ OnProgress(AzureUtilsStage.Database, $"Creating new database '{dbCatalog}'...");
+ var database = await sqlServer.Databases.Define(dbCatalog).WithEdition(DatabaseEdition.Standard).CreateAsync();
+ }
+ else
+ {
+ await RequestConfirmation($"Database '{dbCatalog}' already exists. Do you wish to continue?");
+ }
+
+ //Add permissions for environment group on database
+ OnProgress(AzureUtilsStage.Database, $"Adding environment group permissions on '{dbCatalog}'...");
+ using (DbManager db = DbManager.FromDataSource(new DataSource()
+ {
+ Type = DataSourceType.Azure,
+ Address = settings.DB_ADDRESS,
+ Catalog = dbCatalog,
+ UserName = adEmail,
+ Password = adPassword,
+ IntegratedSecurity = false
+ }))
+ {
+ try
+ {
+ await db.ExecuteCommandAsync($"CREATE USER [{environmentGroupName}] FROM EXTERNAL PROVIDER");
+ await db.ExecuteCommandAsync($"ALTER ROLE db_datareader ADD MEMBER [{environmentGroupName}];");
+ await db.ExecuteCommandAsync($"ALTER ROLE db_datawriter ADD MEMBER [{environmentGroupName}];");
+ }
+ catch (Exception ex)
+ {
+ await RequestConfirmation($"Error creating/adding permissions for environment group '{environmentGroupName}' on database.\n{ex.FlattenMessage()}\n\nDo you wish to continue?");
+ }
+ }
+
+ OnProgress(AzureUtilsStage.Database, $"Adding BackupUser permissions on '{dbCatalog}'...");
+ //Create backup user
using (DbManager db = DbManager.FromCredentials(settings.DB_ADDRESS, dbCatalog, settings.DB_USER_NAME, settings.DB_PASSWORD))
{
- await db.ExecuteCommandAsync("CREATE USER [BackupUser] FOR LOGIN [BackupUser] WITH DEFAULT_SCHEMA=[dbo]");
- await db.ExecuteCommandAsync("EXEC sp_addrolemember N'db_owner', N'BackupUser'");
- await db.ExecuteCommandAsync("EXEC sp_addrolemember N'db_accessadmin', N'BackupUser'");
- await db.ExecuteCommandAsync("EXEC sp_addrolemember N'db_securityadmin', N'BackupUser'");
- await db.ExecuteCommandAsync("EXEC sp_addrolemember N'db_backupoperator', N'BackupUser'");
- await db.ExecuteCommandAsync("EXEC sp_addrolemember N'db_datareader', N'BackupUser'");
- await db.ExecuteCommandAsync("EXEC sp_addrolemember N'db_datawriter', N'BackupUser'");
+ try
+ {
+ await db.ExecuteCommandAsync("CREATE USER [BackupUser] FOR LOGIN [BackupUser] WITH DEFAULT_SCHEMA=[dbo]");
+ await db.ExecuteCommandAsync("EXEC sp_addrolemember N'db_owner', N'BackupUser'");
+ await db.ExecuteCommandAsync("EXEC sp_addrolemember N'db_accessadmin', N'BackupUser'");
+ await db.ExecuteCommandAsync("EXEC sp_addrolemember N'db_securityadmin', N'BackupUser'");
+ await db.ExecuteCommandAsync("EXEC sp_addrolemember N'db_backupoperator', N'BackupUser'");
+ await db.ExecuteCommandAsync("EXEC sp_addrolemember N'db_datareader', N'BackupUser'");
+ await db.ExecuteCommandAsync("EXEC sp_addrolemember N'db_datawriter', N'BackupUser'");
+ }
+ catch (Exception ex)
+ {
+ await RequestConfirmation($"Error creating/adding permissions for BackupUser on database.\n{ex.FlattenMessage()}\n\nDo you wish to continue?");
+ }
}
+ //Synchronize Schema
+ //await _deploymentManager.OpenSQLExaminerSchema(sourceSlot, slot);
+ //await RequestConfirmation($"Please synchronize the database schema between '{settings.DB_CATALOG}' and '{dbCatalog}'.\nPlease confirm in order to continue.");
+ //OnProgress(AzureUtilsStage.Database, $"Waiting for database schema synchronization...");
+
+ //await _deploymentManager.OpenSQLExaminerData(sourceSlot, slot, true);
+ //await RequestConfirmation($"Please synchronize the database static collections between '{settings.DB_CATALOG}' and '{dbCatalog}'.\nPlease confirm in order to continue.");
+ //OnProgress(AzureUtilsStage.Database, $"Waiting for database static collections synchronization...");
+
+ //OnProgress(AzureUtilsStage.Database, $"Retrieving latest Machine Studio version...");
+ //var latestMsVersion = await _deploymentManager.GetLatestMachineStudioVersion(sourceSlot);
+
+ //OnProgress(AzureUtilsStage.Database, $"Retrieving latest PPC version...");
+ //var latestPPCVersion = await _deploymentManager.GetLatestPPCVersion(sourceSlot);
+
+ //var targetSettings = await slot.GetMachineServiceSettingsAsync();
+
+ //using (ObservablesContext db = ObservablesContext.CreateDefault(targetSettings.ToDataSource()))
+ //{
+ // db.MachineStudioVersions.Add(latestMsVersion);
+ // db.TangoVersions.Add(latestPPCVersion);
+ //}
+
//Add Storage Containers
+ OnProgress(AzureUtilsStage.Storage, $"Connecting to storage account...");
var targetAccount = CloudStorageAccount.Parse(settings.STORAGE_ACCOUNT);
var targetClient = targetAccount.CreateCloudBlobClient();
+ OnProgress(AzureUtilsStage.Storage, $"Creating storage container '{machineStudioContainerName}'...");
var machineStudioContainer = targetClient.GetContainerReference(machineStudioContainerName);
await machineStudioContainer.CreateIfNotExistsAsync();
+ OnProgress(AzureUtilsStage.Storage, $"Creating storage container '{ppcContainerName}'...");
var ppcContainer = targetClient.GetContainerReference(ppcContainerName);
await ppcContainer.CreateIfNotExistsAsync();
+ OnProgress(AzureUtilsStage.Storage, $"Creating storage container '{machineServiceBackupsContainerName}'...");
var machineServiceBackupsContainer = targetClient.GetContainerReference(machineServiceBackupsContainerName);
await machineServiceBackupsContainer.CreateIfNotExistsAsync();
+ OnProgress(AzureUtilsStage.Storage, $"Creating storage container '{machineServiceLogsContainerName}'...");
var machineServiceLogsContainer = targetClient.GetContainerReference(machineServiceLogsContainerName);
await machineServiceLogsContainer.CreateIfNotExistsAsync();
+ _deploymentManager.UpgradeConfiguration.UpgradeMachineService = true;
+ _deploymentManager.UpgradeConfiguration.UpgradeMachineStudio = true;
+ _deploymentManager.UpgradeConfiguration.UpgradePPC = true;
+
+ await _deploymentManager.PerformFullUpgrade(sourceSlot, slot);
+
+ OnProgress(AzureUtilsStage.Ready, "Deployment slot created successfully.", 0, 100, false);
+
return slot;
}
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Tango.AzureUtils.csproj b/Software/Visual_Studio/Azure/Tango.AzureUtils/Tango.AzureUtils.csproj
index 77547a85c..f7a0e2436 100644
--- a/Software/Visual_Studio/Azure/Tango.AzureUtils/Tango.AzureUtils.csproj
+++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Tango.AzureUtils.csproj
@@ -226,6 +226,7 @@
<Compile Include="AzureUtilsAuthenticationFactory.cs" />
<Compile Include="AzureUtilsComponentBase.cs" />
<Compile Include="AzureUtilsCredentials.cs" />
+ <Compile Include="AzureUtilsConfirmationEventArgs.cs" />
<Compile Include="Deployment\DeploymentManager.cs" />
<Compile Include="AzureUtilsProgressEventArgs.cs" />
<Compile Include="AzureUtilsStage.cs" />
@@ -244,6 +245,10 @@
<Link>Deployment\GENERAL_ENV_UPGRADE.seproj</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
+ <Content Include="..\..\..\DB\SQLExaminer Projects\GENERAL_ENV_CREATE.sdeproj">
+ <Link>Deployment\GENERAL_ENV_CREATE.sdeproj</Link>
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </Content>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
@@ -256,6 +261,10 @@
<Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project>
<Name>Tango.Core</Name>
</ProjectReference>
+ <ProjectReference Include="..\..\Tango.Logging\Tango.Logging.csproj">
+ <Project>{BC932DBD-7CDB-488C-99E4-F02CF441F55E}</Project>
+ <Name>Tango.Logging</Name>
+ </ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project> \ No newline at end of file