├── .dockerignore
├── .gitignore
├── .sqlops
├── settings.json
└── settings_original_json
├── .vscode
├── launch.json
└── settings.json
├── README.md
├── data_sanitization
├── _archieve
│ ├── create_user.sql
│ ├── createdb.sql
│ ├── ddm.sql
│ ├── demo.sh
│ ├── get_default_path.sql
│ ├── mssql-scripter.sh
│ ├── mssql_scripter.ps1
│ ├── restore.sql
│ ├── restore_demo.sql
│ └── restore_wwi.sql
├── bash
│ ├── bcp_in_loop.ps1
│ ├── bcp_out_loop.ps1
│ └── wwi_script_schema_only.sh
├── create_unittest_db.ps1
├── create_unittest_db_demo.ps1
├── out
│ └── .lost_n_found
├── sanitize_database.ps1
└── sql
│ ├── adventureworks-restore.sql
│ ├── create_user.sql
│ ├── ddm.sql
│ ├── drop_preprod.sql
│ ├── drop_testdb.sql
│ └── restore.sql
├── db
├── .gitignore
├── AdventureWorks.sqlproj
├── AdventureWorks.sqlproj.user
├── README.md
├── publish_profiles
│ └── localdev.publish.xml
├── src
│ ├── functions
│ │ ├── dbo.ufnGetAccountingEndDate.UserDefinedFunction.sql
│ │ ├── dbo.ufnGetAccountingStartDate.UserDefinedFunction.sql
│ │ ├── dbo.ufnGetContactInformation.UserDefinedFunction.sql
│ │ ├── dbo.ufnGetDocumentStatusText.UserDefinedFunction.sql
│ │ ├── dbo.ufnGetProductDealerPrice.UserDefinedFunction.sql
│ │ ├── dbo.ufnGetProductListPrice.UserDefinedFunction.sql
│ │ ├── dbo.ufnGetProductStandardCost.UserDefinedFunction.sql
│ │ ├── dbo.ufnGetPurchaseOrderStatusText.UserDefinedFunction.sql
│ │ ├── dbo.ufnGetSalesOrderStatusText.UserDefinedFunction.sql
│ │ ├── dbo.ufnGetStock.UserDefinedFunction.sql
│ │ └── dbo.ufnLeadingZeros.UserDefinedFunction.sql
│ ├── misc
│ │ ├── HumanResources.HRResumeSchemaCollection.XmlSchemaCollection.sql
│ │ ├── Person.AdditionalContactInfoSchemaCollection.XmlSchemaCollection.sql
│ │ ├── Person.IndividualSurveySchemaCollection.XmlSchemaCollection.sql
│ │ ├── Production.ManuInstructionsSchemaCollection.XmlSchemaCollection.sql
│ │ ├── Production.ProductDescriptionSchemaCollection.XmlSchemaCollection.sql
│ │ ├── Sales.StoreSurveySchemaCollection.XmlSchemaCollection.sql
│ │ ├── dbo.AccountNumber.UserDefinedDataType.sql
│ │ ├── dbo.Flag.UserDefinedDataType.sql
│ │ ├── dbo.Name.UserDefinedDataType.sql
│ │ ├── dbo.NameStyle.UserDefinedDataType.sql
│ │ ├── dbo.OrderNumber.UserDefinedDataType.sql
│ │ ├── dbo.Phone.UserDefinedDataType.sql
│ │ └── ddlDatabaseTriggerLog.DdlTrigger.sql
│ ├── procedures
│ │ ├── HumanResources.uspGetDirectManager.StoredProcedure.sql
│ │ ├── HumanResources.uspGetDirectReports.StoredProcedure.sql
│ │ ├── HumanResources.uspGetEmployeeDetail.StoredProcedure.sql
│ │ ├── HumanResources.uspUpdateEmployeeHireInfo.StoredProcedure.sql
│ │ ├── HumanResources.uspUpdateEmployeeLogin.StoredProcedure.sql
│ │ ├── HumanResources.uspUpdateEmployeePersonalInfo.StoredProcedure.sql
│ │ ├── dbo.uspGetBillOfMaterials.StoredProcedure.sql
│ │ ├── dbo.uspGetEmployeeManagers.StoredProcedure.sql
│ │ ├── dbo.uspGetManagerEmployees.StoredProcedure.sql
│ │ ├── dbo.uspGetWhereUsedProductID.StoredProcedure.sql
│ │ ├── dbo.uspLogError.StoredProcedure.sql
│ │ └── dbo.uspPrintError.StoredProcedure.sql
│ ├── security
│ │ ├── HumanResources.Schema.sql
│ │ ├── Person.Schema.sql
│ │ ├── Production.Schema.sql
│ │ ├── Purchasing.Schema.sql
│ │ └── Sales.Schema.sql
│ ├── tables
│ │ ├── HumanResources.Department.Table.sql
│ │ ├── HumanResources.Employee.Table.sql
│ │ ├── HumanResources.EmployeeDepartmentHistory.Table.sql
│ │ ├── HumanResources.EmployeePayHistory.Table.sql
│ │ ├── HumanResources.JobCandidate.Table.sql
│ │ ├── HumanResources.Shift.Table.sql
│ │ ├── Person.Address.Table.sql
│ │ ├── Person.AddressType.Table.sql
│ │ ├── Person.BusinessEntity.Table.sql
│ │ ├── Person.BusinessEntityAddress.Table.sql
│ │ ├── Person.BusinessEntityContact.Table.sql
│ │ ├── Person.ContactType.Table.sql
│ │ ├── Person.CountryRegion.Table.sql
│ │ ├── Person.EmailAddress.Table.sql
│ │ ├── Person.Password.Table.sql
│ │ ├── Person.Person.Table.sql
│ │ ├── Person.PersonPhone.Table.sql
│ │ ├── Person.PhoneNumberType.Table.sql
│ │ ├── Person.StateProvince.Table.sql
│ │ ├── Production.BillOfMaterials.Table.sql
│ │ ├── Production.Culture.Table.sql
│ │ ├── Production.Document.Table.sql
│ │ ├── Production.Illustration.Table.sql
│ │ ├── Production.Location.Table.sql
│ │ ├── Production.Product.Table.sql
│ │ ├── Production.ProductCategory.Table.sql
│ │ ├── Production.ProductCostHistory.Table.sql
│ │ ├── Production.ProductDescription.Table.sql
│ │ ├── Production.ProductDocument.Table.sql
│ │ ├── Production.ProductInventory.Table.sql
│ │ ├── Production.ProductListPriceHistory.Table.sql
│ │ ├── Production.ProductModel.Table.sql
│ │ ├── Production.ProductModelIllustration.Table.sql
│ │ ├── Production.ProductModelProductDescriptionCulture.Table.sql
│ │ ├── Production.ProductPhoto.Table.sql
│ │ ├── Production.ProductProductPhoto.Table.sql
│ │ ├── Production.ProductReview.Table.sql
│ │ ├── Production.ProductSubcategory.Table.sql
│ │ ├── Production.ScrapReason.Table.sql
│ │ ├── Production.TransactionHistory.Table.sql
│ │ ├── Production.TransactionHistoryArchive.Table.sql
│ │ ├── Production.UnitMeasure.Table.sql
│ │ ├── Production.WorkOrder.Table.sql
│ │ ├── Production.WorkOrderRouting.Table.sql
│ │ ├── Purchasing.ProductVendor.Table.sql
│ │ ├── Purchasing.PurchaseOrderDetail.Table.sql
│ │ ├── Purchasing.PurchaseOrderHeader.Table.sql
│ │ ├── Purchasing.ShipMethod.Table.sql
│ │ ├── Purchasing.Vendor.Table.sql
│ │ ├── Sales.CountryRegionCurrency.Table.sql
│ │ ├── Sales.CreditCard.Table.sql
│ │ ├── Sales.Currency.Table.sql
│ │ ├── Sales.CurrencyRate.Table.sql
│ │ ├── Sales.Customer.Table.sql
│ │ ├── Sales.PersonCreditCard.Table.sql
│ │ ├── Sales.SalesOrderDetail.Table.sql
│ │ ├── Sales.SalesOrderHeader.Table.sql
│ │ ├── Sales.SalesOrderHeaderSalesReason.Table.sql
│ │ ├── Sales.SalesPerson.Table.sql
│ │ ├── Sales.SalesPersonQuotaHistory.Table.sql
│ │ ├── Sales.SalesReason.Table.sql
│ │ ├── Sales.SalesTaxRate.Table.sql
│ │ ├── Sales.SalesTerritory.Table.sql
│ │ ├── Sales.SalesTerritoryHistory.Table.sql
│ │ ├── Sales.ShoppingCartItem.Table.sql
│ │ ├── Sales.SpecialOffer.Table.sql
│ │ ├── Sales.SpecialOfferProduct.Table.sql
│ │ ├── Sales.Store.Table.sql
│ │ ├── dbo.AWBuildVersion.Table.sql
│ │ ├── dbo.DatabaseLog.Table.sql
│ │ └── dbo.ErrorLog.Table.sql
│ └── views
│ │ ├── HumanResources.vEmployee.View.sql
│ │ ├── HumanResources.vEmployeeDepartment.View.sql
│ │ ├── HumanResources.vEmployeeDepartmentHistory.View.sql
│ │ ├── HumanResources.vJobCandidate.View.sql
│ │ ├── HumanResources.vJobCandidateEducation.View.sql
│ │ ├── HumanResources.vJobCandidateEmployment.View.sql
│ │ ├── Person.vAdditionalContactInfo.View.sql
│ │ ├── Person.vStateProvinceCountryRegion.View.sql
│ │ ├── Production.vProductAndDescription.View.sql
│ │ ├── Production.vProductModelCatalogDescription.View.sql
│ │ ├── Production.vProductModelInstructions.View.sql
│ │ ├── Purchasing.vVendorWithAddresses.View.sql
│ │ ├── Purchasing.vVendorWithContacts.View.sql
│ │ ├── Sales.vIndividualCustomer.View.sql
│ │ ├── Sales.vPersonDemographics.View.sql
│ │ ├── Sales.vSalesPerson.View.sql
│ │ ├── Sales.vSalesPersonSalesByFiscalYears.View.sql
│ │ ├── Sales.vStoreWithAddresses.View.sql
│ │ ├── Sales.vStoreWithContacts.View.sql
│ │ └── Sales.vStoreWithDemographics.View.sql
└── utils
│ ├── build.ps1
│ ├── importdb.ps1
│ └── publish.ps1
├── db_tests
├── AdventureWorks
│ ├── data
│ │ ├── adventureworks
│ │ │ ├── seed_data
│ │ │ │ ├── _seed_sequence.md
│ │ │ │ ├── seed_humanresources_department.csv
│ │ │ │ ├── seed_humanresources_employee.csv
│ │ │ │ ├── seed_humanresources_employeedepartmenthistory.csv
│ │ │ │ ├── seed_humanresources_shift.csv
│ │ │ │ ├── seed_person_addressrename.csv
│ │ │ │ ├── seed_person_addresstype.csv
│ │ │ │ ├── seed_person_businessentity.csv
│ │ │ │ ├── seed_person_businessentityaddress.csv
│ │ │ │ ├── seed_person_countryregion.csv
│ │ │ │ ├── seed_person_emailaddress.csv
│ │ │ │ ├── seed_person_person.csv
│ │ │ │ ├── seed_person_personphone.csv
│ │ │ │ ├── seed_person_phonenumbertype.csv
│ │ │ │ ├── seed_person_stateprovince.csv
│ │ │ │ └── seed_sales_salesterritory.csv
│ │ │ ├── uspGetDirectManager_expected_result_for_businessentityid_2.csv
│ │ │ └── uspGetDirectReports_expected_result_for_businessentityid_1.csv
│ │ └── sample_1
│ │ │ ├── my_table_expected_power_results.csv
│ │ │ ├── my_table_initial_data.csv
│ │ │ └── numbers_expected_output.csv
│ ├── database.yml
│ ├── debug
│ │ ├── failed_examples
│ │ │ ├── example_001.sql
│ │ │ └── example_002.sql
│ │ └── passed_examples
│ │ │ ├── example_001.sql
│ │ │ ├── example_002.sql
│ │ │ ├── example_003.sql
│ │ │ ├── example_004.sql
│ │ │ └── example_005.sql
│ ├── demo
│ │ ├── seed_data_gen.sql
│ │ └── setup.md
│ ├── lib
│ │ └── helpers
│ │ │ ├── my_helper.rb
│ │ │ └── seed_data.rb
│ ├── spec
│ │ ├── sample_1.rb
│ │ ├── uspGetDirectManager.rb
│ │ └── uspGetDirectReports.rb
│ └── sql
│ │ ├── adventureworks
│ │ ├── exec_humanresources_uspGetDirectManager.sql.erb
│ │ └── exec_humanresources_uspGetDirectReports.sql.erb
│ │ └── sample_1
│ │ ├── create_my_table.sql.erb
│ │ ├── my_table_on_power.sql.erb
│ │ ├── play_with_numbers.sql.erb
│ │ ├── sysobjects.sql.erb
│ │ └── sysobjects_with_params.sql.erb
├── WideWorldImporters
│ ├── .dockerignore
│ ├── Dockerfile
│ ├── data
│ │ ├── WideWorldImporters
│ │ │ ├── customer_transactions.csv
│ │ │ ├── customer_transactions_complex_data.csv
│ │ │ ├── customers
│ │ │ │ └── load
│ │ │ │ │ ├── customers.csv
│ │ │ │ │ └── sales_customers.csv
│ │ │ └── reference_data
│ │ │ │ └── match
│ │ │ │ └── application_people_personid_1.csv
│ │ └── sample_1
│ │ │ ├── my_table_expected_power_results.csv
│ │ │ ├── my_table_initial_data.csv
│ │ │ └── numbers_expected_output.csv
│ ├── database.yml
│ ├── docker-compose.yml
│ ├── lib
│ │ └── helpers
│ │ │ ├── common_helper.rb
│ │ │ └── my_helper.rb
│ ├── runner.sh
│ ├── spec
│ │ ├── customer
│ │ │ └── wwi_customer.rb
│ │ ├── reference_data
│ │ │ └── application_People.rb
│ │ ├── sample_1.rb
│ │ ├── test_perf_sample.zip
│ │ └── website
│ │ │ ├── activateWebsiteLogon.rb
│ │ │ ├── changePassword.rb
│ │ │ ├── insertCustomerOrder.rb
│ │ │ ├── invoiceCustomerOrder.rb
│ │ │ ├── recordColdRoomTemperatures.rb
│ │ │ ├── recordVehicleTemperature.rb
│ │ │ ├── searchForCustomers.rb
│ │ │ ├── searchForPeople.rb
│ │ │ ├── searchForStockItems.rb
│ │ │ ├── searchForStockItemsByTags.rb
│ │ │ └── searchForSuppliers.rb
│ ├── sql
│ │ ├── WideWorldImporters
│ │ │ ├── customer_transactions.sql.erb
│ │ │ ├── customer_transactions_complex_data.sql.erb
│ │ │ ├── reference_data
│ │ │ │ └── check_personid.sql.erb
│ │ │ ├── test_perf_samples
│ │ │ │ └── wait_n_query.sql.erb
│ │ │ └── website
│ │ │ │ ├── activateLogon.sql.erb
│ │ │ │ ├── changePassword.sql.erb
│ │ │ │ ├── init_n_changePassword.sql.erb
│ │ │ │ └── init_n_changeWrongPassword.sql.erb
│ │ ├── common
│ │ │ ├── select_vars.sql.erb
│ │ │ ├── sproc.sql.erb
│ │ │ └── t_func.sql.erb
│ │ └── sample_1
│ │ │ ├── create_my_table.sql.erb
│ │ │ ├── my_table_on_power.sql.erb
│ │ │ ├── play_with_numbers.sql.erb
│ │ │ ├── sysobjects.sql.erb
│ │ │ └── sysobjects_with_params.sql.erb
│ └── wait-for-it.sh
├── demotest
│ ├── data
│ │ └── sample_1
│ │ │ ├── my_table_expected_power_results.csv
│ │ │ ├── my_table_initial_data.csv
│ │ │ └── numbers_expected_output.csv
│ ├── database.yml
│ ├── debug
│ │ ├── failed_examples
│ │ │ └── example_001.sql
│ │ └── passed_examples
│ │ │ └── example_001.sql
│ ├── lib
│ │ └── helpers
│ │ │ └── my_helper.rb
│ ├── spec
│ │ └── sample_1.rb
│ └── sql
│ │ └── sample_1
│ │ ├── create_my_table.sql.erb
│ │ ├── my_table_on_power.sql.erb
│ │ ├── play_with_numbers.sql.erb
│ │ ├── sysobjects.sql.erb
│ │ └── sysobjects_with_params.sql.erb
├── setup.md
├── setup_slacker_freetds.md
└── slacker_sample
│ ├── data
│ └── sample_1
│ │ ├── my_table_expected_power_results.csv
│ │ ├── my_table_initial_data.csv
│ │ └── numbers_expected_output.csv
│ ├── database.yml
│ ├── lib
│ └── helpers
│ │ └── my_helper.rb
│ ├── spec
│ └── sample_1.rb
│ └── sql
│ └── sample_1
│ ├── create_my_table.sql.erb
│ ├── my_table_on_power.sql.erb
│ ├── play_with_numbers.sql.erb
│ ├── sysobjects.sql.erb
│ └── sysobjects_with_params.sql.erb
├── docker-compose.yml
├── docker-login.sh
├── docker_cluster
├── README.md
├── _archieve
│ ├── docker_dev.sh
│ ├── docker_pp.sh
│ ├── docker_wwi.sh
│ ├── mssql_image_build.sh
│ ├── run_slow.ps1
│ ├── runner_build.sh
│ └── startup_all_dev.sh
├── aks
│ ├── 1-basics.sh
│ ├── 2-build your own.sh
│ ├── 3-aks-provisioning.sh
│ ├── 4-deploy to aks.sh
│ ├── 5-resotre database.sh
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── kube-secret.sh
│ ├── mssql-cli.yml
│ ├── namespace.yml
│ ├── pvc.yml
│ ├── restore.sql
│ ├── sql-statefulset.yml
│ ├── webapp.yml
│ └── wwi_unittest.yml
├── demodb
│ ├── mssql
│ │ ├── Dockerfile
│ │ └── docker_build_push.sh
│ └── pgsql
│ │ ├── Dockerfile
│ │ └── docker_build_push.sh
├── docker network
│ ├── docker_build
│ │ └── Dockerfile
│ └── net.sh
├── docker-compose
│ └── docker-compose.yml
├── kubernetes
│ ├── common_samples
│ │ ├── iptable
│ │ ├── kubectl_commands.sh
│ │ ├── kubectl_exec
│ │ ├── management
│ │ │ ├── commands.sh
│ │ │ └── persistent_volumes.sh
│ │ └── monitoring.sh
│ ├── dev_env
│ │ ├── demo.sh
│ │ ├── jobs
│ │ │ ├── database_migration_job.yml
│ │ │ └── database_test_job.yml
│ │ ├── namespace.yaml
│ │ └── wwi_unittest.yml
│ ├── multipods
│ │ ├── demo.sh
│ │ ├── mssql
│ │ │ ├── jobs
│ │ │ │ ├── business-continuity
│ │ │ │ │ ├── sql-scheduled-backup.yml
│ │ │ │ │ └── sql-scheduled-logbackup.yml
│ │ │ │ ├── migration
│ │ │ │ │ └── sql-db-migration.yml
│ │ │ │ └── provisioning
│ │ │ │ │ └── sql-provisioning.yml
│ │ │ ├── persistent_volume
│ │ │ │ ├── pv-host.yml
│ │ │ │ └── pv-nfs.yml
│ │ │ ├── sql-pv-host.yml
│ │ │ └── web.yml
│ │ └── namespace.yml
│ ├── nfs-provisioner
│ │ ├── auth
│ │ │ ├── clusterrole.yaml
│ │ │ ├── clusterrolebinding.yaml
│ │ │ └── serviceaccount.yaml
│ │ ├── class.yml
│ │ ├── deployment.yml
│ │ ├── install.sh
│ │ ├── pvc.yml
│ │ └── test.yml
│ ├── prod_db
│ │ ├── demo.sh
│ │ ├── mssql
│ │ │ ├── hostpath
│ │ │ │ └── sql-pv-host.yml
│ │ │ ├── jobs
│ │ │ │ ├── business-continuity
│ │ │ │ │ ├── sql-scheduled-backup.yml
│ │ │ │ │ └── sql-scheduled-logbackup.yml
│ │ │ │ ├── migration
│ │ │ │ │ └── sql-db-migration.yml
│ │ │ │ └── provisioning
│ │ │ │ │ └── sql-provisioning.yml
│ │ │ ├── persistent_volume
│ │ │ │ ├── hostpath
│ │ │ │ │ └── pv-host.yml
│ │ │ │ ├── pv-nfs.yml
│ │ │ │ ├── pvc-nfs.yml
│ │ │ │ └── rw
│ │ │ │ │ ├── pv-nfs.yml
│ │ │ │ │ └── pvc-nfs.yml
│ │ │ ├── sql-pv-nfs.yml
│ │ │ └── web.yml
│ │ ├── namespace.yml
│ │ └── pgsql
│ │ │ ├── jobs
│ │ │ └── pg-provisioning.yml
│ │ │ ├── persistent_volume
│ │ │ ├── pv-host.yml
│ │ │ └── pv-nfs.yml
│ │ │ ├── pgsql-pv-host.yml
│ │ │ └── pgsql-pv-nfs.yml
│ └── statefulset
│ │ ├── nfs-prod
│ │ ├── jobs
│ │ │ ├── business-continuity
│ │ │ │ ├── sql-scheduled-backup.yml
│ │ │ │ └── sql-scheduled-logbackup.yml
│ │ │ ├── migration
│ │ │ │ └── sql-db-migration.yml
│ │ │ └── provisioning
│ │ │ │ └── sql-provisioning.yml
│ │ ├── sql-pv.yml
│ │ └── web.yml
│ │ ├── prod
│ │ ├── jobs
│ │ │ ├── business-continuity
│ │ │ │ ├── sql-scheduled-backup.yml
│ │ │ │ └── sql-scheduled-logbackup.yml
│ │ │ ├── migration
│ │ │ │ └── sql-db-migration.yml
│ │ │ └── provisioning
│ │ │ │ └── sql-provisioning.yml
│ │ ├── persistent_volume
│ │ │ ├── pv-host.yml
│ │ │ └── pv-nfs.yml
│ │ ├── sql-pv.yml
│ │ └── web.yml
│ │ └── testenv
│ │ ├── demo.sh
│ │ ├── jobs
│ │ ├── database_migration_job.yml
│ │ └── database_test_job.yml
│ │ ├── namespace.yaml
│ │ ├── nginx_loadbalacer.yml
│ │ └── wwi_unittest.yml
├── kubernetes_azure
│ ├── acs_provisioning.sh
│ ├── az
│ ├── common_samples
│ │ ├── kubectl_commands.sh
│ │ └── management
│ │ │ ├── commands.sh
│ │ │ └── persistent_volumes.sh
│ ├── namespace.yaml
│ └── wwi_unittest.yml
├── loadbalancer
│ └── slacker
│ │ ├── Dockerfile
│ │ ├── default.conf
│ │ └── docker_build.sh
├── mssql_jobs
│ ├── backup
│ │ ├── Dockerfile
│ │ ├── docker_build.sh
│ │ ├── full-backup.sh
│ │ ├── full-backup.sql
│ │ ├── log-backup.sh
│ │ └── log-backup.sql
│ └── provisioning
│ │ ├── Dockerfile
│ │ ├── adventureworks-restore.sql
│ │ ├── docker_build.sh
│ │ ├── provision.sh
│ │ └── restore.sql
├── mssql_unittest
│ ├── Dockerfile
│ ├── docker_build_push.sh
│ ├── docker_build_push_demo.sh
│ └── docker_push.sh
├── pgsql_jobs
│ └── provisioning
│ │ ├── Dockerfile
│ │ ├── docker_build.sh
│ │ └── provisioning.sh
├── slacker
│ ├── Dockerfile
│ ├── docker_build.sh
│ ├── docker_push.sh
│ └── gemrc
├── slacker_runner
│ ├── Dockerfile
│ ├── Dockerfile_node_ruby
│ ├── Dockerfile_old
│ ├── docker_build.sh
│ └── gemrc
├── swarm
│ ├── docker-compose.yml
│ └── docker-stack.sh
└── tools
│ ├── Dockerfile
│ ├── docker_build.sh
│ └── sqlcmd
│ ├── Dockerfile
│ └── docker_build.sh
├── install-powershell.sh
├── test_controller
├── .vscode
│ └── launch.json
├── Dockerfile
├── docker_build_push.sh
├── get_kube_info.sh
├── get_test_pods.sh
├── run_tests.py
├── run_tests.sh
└── scale_k8s.sh
├── test_runner
├── .dockerignore
├── app.js
├── bin
│ └── www
├── config
│ └── slackerRunner.yml
├── gulpfile.js
├── modules
│ ├── resultformatter.js
│ └── runnerconfig.js
├── package.json
├── public
│ └── css
│ │ └── marked.css
├── routes
│ ├── api
│ │ ├── getspecs.js
│ │ ├── runall.js
│ │ └── runspec.js
│ └── index.js
└── views
│ ├── docs
│ └── index.md
│ ├── error.ejs
│ └── index.ejs
├── tools_demo
├── init
│ ├── create_databases.sql
│ └── init_docker.sh
├── pg
│ └── pgsql
│ │ ├── init_db.sql
│ │ ├── pg_stats.sql
│ │ ├── stats.sql
│ │ └── table_size.sql
├── settings
│ └── sql.json
└── sql
│ ├── all_db_space_used.sql
│ ├── backup_detail.sql
│ ├── backup_insight.sql
│ ├── db_size.sql
│ ├── diskusage.sql
│ ├── get _all_db_info.sql
│ ├── graphdb.sql
│ ├── rquery.sql
│ ├── sql2017.sql
│ └── wwi_vtemp.sql
├── vsts
├── docker-compose.yml
├── linux_agent
│ ├── agent_cleanup.sh
│ └── setup.sh
├── sqldevops-db-test-container-CI.json
└── sqldevops-webapp-container.json
└── web_app
├── .bowerrc
├── .dockerignore
├── .eslintrc.js
├── Dockerfile
├── app.js
├── bin
└── www
├── bower.json
├── docker_build.sh
├── gulpfile.js
├── package-lock.json
├── package.json
├── public
├── css
│ └── dashboard.css
├── js
│ ├── seq_0_utils.js
│ └── seq_1_dashboard.js
└── lib
│ ├── bootstrap
│ ├── .bower.json
│ ├── CHANGELOG.md
│ ├── Gemfile
│ ├── Gemfile.lock
│ ├── Gruntfile.js
│ ├── ISSUE_TEMPLATE.md
│ ├── LICENSE
│ ├── README.md
│ ├── bower.json
│ ├── dist
│ │ ├── css
│ │ │ ├── bootstrap-theme.css
│ │ │ ├── bootstrap-theme.css.map
│ │ │ ├── bootstrap-theme.min.css
│ │ │ ├── bootstrap-theme.min.css.map
│ │ │ ├── bootstrap.css
│ │ │ ├── bootstrap.css.map
│ │ │ ├── bootstrap.min.css
│ │ │ └── bootstrap.min.css.map
│ │ ├── fonts
│ │ │ ├── glyphicons-halflings-regular.eot
│ │ │ ├── glyphicons-halflings-regular.svg
│ │ │ ├── glyphicons-halflings-regular.ttf
│ │ │ ├── glyphicons-halflings-regular.woff
│ │ │ └── glyphicons-halflings-regular.woff2
│ │ └── js
│ │ │ ├── bootstrap.js
│ │ │ ├── bootstrap.min.js
│ │ │ └── npm.js
│ ├── fonts
│ │ ├── glyphicons-halflings-regular.eot
│ │ ├── glyphicons-halflings-regular.svg
│ │ ├── glyphicons-halflings-regular.ttf
│ │ ├── glyphicons-halflings-regular.woff
│ │ └── glyphicons-halflings-regular.woff2
│ ├── grunt
│ │ ├── .jshintrc
│ │ ├── bs-commonjs-generator.js
│ │ ├── bs-glyphicons-data-generator.js
│ │ ├── bs-lessdoc-parser.js
│ │ ├── bs-raw-files-generator.js
│ │ ├── change-version.js
│ │ ├── configBridge.json
│ │ ├── npm-shrinkwrap.json
│ │ └── sauce_browsers.yml
│ ├── js
│ │ ├── .jscsrc
│ │ ├── .jshintrc
│ │ ├── affix.js
│ │ ├── alert.js
│ │ ├── button.js
│ │ ├── carousel.js
│ │ ├── collapse.js
│ │ ├── dropdown.js
│ │ ├── modal.js
│ │ ├── popover.js
│ │ ├── scrollspy.js
│ │ ├── tab.js
│ │ ├── tooltip.js
│ │ └── transition.js
│ ├── less
│ │ ├── .csscomb.json
│ │ ├── .csslintrc
│ │ ├── alerts.less
│ │ ├── badges.less
│ │ ├── bootstrap.less
│ │ ├── breadcrumbs.less
│ │ ├── button-groups.less
│ │ ├── buttons.less
│ │ ├── carousel.less
│ │ ├── close.less
│ │ ├── code.less
│ │ ├── component-animations.less
│ │ ├── dropdowns.less
│ │ ├── forms.less
│ │ ├── glyphicons.less
│ │ ├── grid.less
│ │ ├── input-groups.less
│ │ ├── jumbotron.less
│ │ ├── labels.less
│ │ ├── list-group.less
│ │ ├── media.less
│ │ ├── mixins.less
│ │ ├── mixins
│ │ │ ├── alerts.less
│ │ │ ├── background-variant.less
│ │ │ ├── border-radius.less
│ │ │ ├── buttons.less
│ │ │ ├── center-block.less
│ │ │ ├── clearfix.less
│ │ │ ├── forms.less
│ │ │ ├── gradients.less
│ │ │ ├── grid-framework.less
│ │ │ ├── grid.less
│ │ │ ├── hide-text.less
│ │ │ ├── image.less
│ │ │ ├── labels.less
│ │ │ ├── list-group.less
│ │ │ ├── nav-divider.less
│ │ │ ├── nav-vertical-align.less
│ │ │ ├── opacity.less
│ │ │ ├── pagination.less
│ │ │ ├── panels.less
│ │ │ ├── progress-bar.less
│ │ │ ├── reset-filter.less
│ │ │ ├── reset-text.less
│ │ │ ├── resize.less
│ │ │ ├── responsive-visibility.less
│ │ │ ├── size.less
│ │ │ ├── tab-focus.less
│ │ │ ├── table-row.less
│ │ │ ├── text-emphasis.less
│ │ │ ├── text-overflow.less
│ │ │ └── vendor-prefixes.less
│ │ ├── modals.less
│ │ ├── navbar.less
│ │ ├── navs.less
│ │ ├── normalize.less
│ │ ├── pager.less
│ │ ├── pagination.less
│ │ ├── panels.less
│ │ ├── popovers.less
│ │ ├── print.less
│ │ ├── progress-bars.less
│ │ ├── responsive-embed.less
│ │ ├── responsive-utilities.less
│ │ ├── scaffolding.less
│ │ ├── tables.less
│ │ ├── theme.less
│ │ ├── thumbnails.less
│ │ ├── tooltip.less
│ │ ├── type.less
│ │ ├── utilities.less
│ │ ├── variables.less
│ │ └── wells.less
│ ├── nuget
│ │ ├── MyGet.ps1
│ │ ├── bootstrap.less.nuspec
│ │ └── bootstrap.nuspec
│ ├── package.js
│ └── package.json
│ ├── chart.js
│ ├── .bower.json
│ ├── .editorconfig
│ ├── .eslintignore
│ ├── .eslintrc
│ ├── LICENSE.md
│ ├── MAINTAINING.md
│ ├── README.md
│ ├── book.json
│ ├── bower.json
│ ├── composer.json
│ ├── dist
│ │ ├── Chart.bundle.js
│ │ ├── Chart.bundle.min.js
│ │ ├── Chart.js
│ │ └── Chart.min.js
│ ├── docs
│ │ ├── README.md
│ │ ├── SUMMARY.md
│ │ ├── axes
│ │ │ ├── README.md
│ │ │ ├── cartesian
│ │ │ │ ├── README.md
│ │ │ │ ├── category.md
│ │ │ │ ├── linear.md
│ │ │ │ ├── logarithmic.md
│ │ │ │ └── time.md
│ │ │ ├── labelling.md
│ │ │ ├── radial
│ │ │ │ ├── README.md
│ │ │ │ └── linear.md
│ │ │ └── styling.md
│ │ ├── charts
│ │ │ ├── README.md
│ │ │ ├── area.md
│ │ │ ├── bar.md
│ │ │ ├── bubble.md
│ │ │ ├── doughnut.md
│ │ │ ├── line.md
│ │ │ ├── mixed.md
│ │ │ ├── polar.md
│ │ │ ├── radar.md
│ │ │ └── scatter.md
│ │ ├── configuration
│ │ │ ├── README.md
│ │ │ ├── animations.md
│ │ │ ├── elements.md
│ │ │ ├── layout.md
│ │ │ ├── legend.md
│ │ │ ├── title.md
│ │ │ └── tooltip.md
│ │ ├── developers
│ │ │ ├── README.md
│ │ │ ├── api.md
│ │ │ ├── axes.md
│ │ │ ├── charts.md
│ │ │ ├── contributing.md
│ │ │ ├── plugins.md
│ │ │ └── updates.md
│ │ ├── general
│ │ │ ├── README.md
│ │ │ ├── colors.md
│ │ │ ├── fonts.md
│ │ │ ├── interactions
│ │ │ │ ├── README.md
│ │ │ │ ├── events.md
│ │ │ │ └── modes.md
│ │ │ └── responsive.md
│ │ ├── getting-started
│ │ │ ├── README.md
│ │ │ ├── installation.md
│ │ │ ├── integration.md
│ │ │ └── usage.md
│ │ ├── notes
│ │ │ ├── README.md
│ │ │ ├── comparison.md
│ │ │ ├── extensions.md
│ │ │ └── license.md
│ │ └── style.css
│ ├── gulpfile.js
│ ├── karma.conf.js
│ ├── package.json
│ ├── samples
│ │ ├── advanced
│ │ │ ├── data-labelling.html
│ │ │ └── progress-bar.html
│ │ ├── charts
│ │ │ ├── area
│ │ │ │ ├── analyser.js
│ │ │ │ ├── line-boundaries.html
│ │ │ │ ├── line-datasets.html
│ │ │ │ ├── line-stacked.html
│ │ │ │ └── radar.html
│ │ │ ├── bar
│ │ │ │ ├── horizontal.html
│ │ │ │ ├── multi-axis.html
│ │ │ │ ├── stacked-group.html
│ │ │ │ ├── stacked.html
│ │ │ │ └── vertical.html
│ │ │ ├── bubble.html
│ │ │ ├── combo-bar-line.html
│ │ │ ├── doughnut.html
│ │ │ ├── line
│ │ │ │ ├── basic.html
│ │ │ │ ├── interpolation-modes.html
│ │ │ │ ├── line-styles.html
│ │ │ │ ├── multi-axis.html
│ │ │ │ ├── point-sizes.html
│ │ │ │ ├── point-styles.html
│ │ │ │ ├── skip-points.html
│ │ │ │ └── stepped.html
│ │ │ ├── pie.html
│ │ │ ├── polar-area.html
│ │ │ ├── radar-skip-points.html
│ │ │ ├── radar.html
│ │ │ └── scatter
│ │ │ │ ├── basic.html
│ │ │ │ └── multi-axis.html
│ │ ├── favicon.ico
│ │ ├── index.html
│ │ ├── legend
│ │ │ ├── point-style.html
│ │ │ └── positioning.html
│ │ ├── logo.svg
│ │ ├── samples.js
│ │ ├── scales
│ │ │ ├── filtering-labels.html
│ │ │ ├── gridlines-display.html
│ │ │ ├── gridlines-style.html
│ │ │ ├── linear
│ │ │ │ ├── min-max-suggested.html
│ │ │ │ ├── min-max.html
│ │ │ │ └── step-size.html
│ │ │ ├── logarithmic
│ │ │ │ ├── line.html
│ │ │ │ └── scatter.html
│ │ │ ├── multiline-labels.html
│ │ │ ├── non-numeric-y.html
│ │ │ └── time
│ │ │ │ ├── combo.html
│ │ │ │ ├── line-point-data.html
│ │ │ │ └── line.html
│ │ ├── style.css
│ │ ├── tooltips
│ │ │ ├── border.html
│ │ │ ├── callbacks.html
│ │ │ ├── custom-line.html
│ │ │ ├── custom-pie.html
│ │ │ ├── custom-points.html
│ │ │ ├── interactions.html
│ │ │ └── positioning.html
│ │ └── utils.js
│ ├── src
│ │ ├── chart.js
│ │ ├── charts
│ │ │ ├── Chart.Bar.js
│ │ │ ├── Chart.Bubble.js
│ │ │ ├── Chart.Doughnut.js
│ │ │ ├── Chart.Line.js
│ │ │ ├── Chart.PolarArea.js
│ │ │ ├── Chart.Radar.js
│ │ │ └── Chart.Scatter.js
│ │ ├── controllers
│ │ │ ├── controller.bar.js
│ │ │ ├── controller.bubble.js
│ │ │ ├── controller.doughnut.js
│ │ │ ├── controller.line.js
│ │ │ ├── controller.polarArea.js
│ │ │ └── controller.radar.js
│ │ ├── core
│ │ │ ├── core.animation.js
│ │ │ ├── core.canvasHelpers.js
│ │ │ ├── core.controller.js
│ │ │ ├── core.datasetController.js
│ │ │ ├── core.element.js
│ │ │ ├── core.helpers.js
│ │ │ ├── core.interaction.js
│ │ │ ├── core.js
│ │ │ ├── core.layoutService.js
│ │ │ ├── core.plugin.js
│ │ │ ├── core.scale.js
│ │ │ ├── core.scaleService.js
│ │ │ ├── core.ticks.js
│ │ │ └── core.tooltip.js
│ │ ├── elements
│ │ │ ├── element.arc.js
│ │ │ ├── element.line.js
│ │ │ ├── element.point.js
│ │ │ └── element.rectangle.js
│ │ ├── platforms
│ │ │ ├── platform.dom.js
│ │ │ └── platform.js
│ │ ├── plugins
│ │ │ ├── plugin.filler.js
│ │ │ ├── plugin.legend.js
│ │ │ └── plugin.title.js
│ │ └── scales
│ │ │ ├── scale.category.js
│ │ │ ├── scale.linear.js
│ │ │ ├── scale.linearbase.js
│ │ │ ├── scale.logarithmic.js
│ │ │ ├── scale.radialLinear.js
│ │ │ └── scale.time.js
│ └── test
│ │ ├── fixtures
│ │ └── plugin.filler
│ │ │ ├── fill-line-boundary-end-span.json
│ │ │ ├── fill-line-boundary-end-span.png
│ │ │ ├── fill-line-boundary-end.json
│ │ │ ├── fill-line-boundary-end.png
│ │ │ ├── fill-line-boundary-origin-span.json
│ │ │ ├── fill-line-boundary-origin-span.png
│ │ │ ├── fill-line-boundary-origin-spline-span.json
│ │ │ ├── fill-line-boundary-origin-spline-span.png
│ │ │ ├── fill-line-boundary-origin-spline.json
│ │ │ ├── fill-line-boundary-origin-spline.png
│ │ │ ├── fill-line-boundary-origin-stepped-span.json
│ │ │ ├── fill-line-boundary-origin-stepped-span.png
│ │ │ ├── fill-line-boundary-origin-stepped.json
│ │ │ ├── fill-line-boundary-origin-stepped.png
│ │ │ ├── fill-line-boundary-origin.json
│ │ │ ├── fill-line-boundary-origin.png
│ │ │ ├── fill-line-boundary-start-span.json
│ │ │ ├── fill-line-boundary-start-span.png
│ │ │ ├── fill-line-boundary-start.json
│ │ │ ├── fill-line-boundary-start.png
│ │ │ ├── fill-line-dataset-span.json
│ │ │ ├── fill-line-dataset-span.png
│ │ │ ├── fill-line-dataset-spline-span.json
│ │ │ ├── fill-line-dataset-spline-span.png
│ │ │ ├── fill-line-dataset-spline.json
│ │ │ ├── fill-line-dataset-spline.png
│ │ │ ├── fill-line-dataset.json
│ │ │ ├── fill-line-dataset.png
│ │ │ ├── fill-radar-boundary-origin-spline.json
│ │ │ ├── fill-radar-boundary-origin-spline.png
│ │ │ ├── fill-radar-boundary-origin.json
│ │ │ └── fill-radar-boundary-origin.png
│ │ ├── jasmine.context.js
│ │ ├── jasmine.index.js
│ │ ├── jasmine.matchers.js
│ │ ├── jasmine.utils.js
│ │ └── specs
│ │ ├── controller.bar.tests.js
│ │ ├── controller.bubble.tests.js
│ │ ├── controller.doughnut.tests.js
│ │ ├── controller.line.tests.js
│ │ ├── controller.polarArea.tests.js
│ │ ├── controller.radar.tests.js
│ │ ├── core.controller.tests.js
│ │ ├── core.datasetController.tests.js
│ │ ├── core.element.tests.js
│ │ ├── core.helpers.tests.js
│ │ ├── core.interaction.tests.js
│ │ ├── core.layoutService.tests.js
│ │ ├── core.plugin.tests.js
│ │ ├── core.scaleService.tests.js
│ │ ├── core.tooltip.tests.js
│ │ ├── element.arc.tests.js
│ │ ├── element.line.tests.js
│ │ ├── element.point.tests.js
│ │ ├── element.rectangle.tests.js
│ │ ├── global.defaults.tests.js
│ │ ├── global.deprecations.tests.js
│ │ ├── platform.dom.tests.js
│ │ ├── plugin.filler.tests.js
│ │ ├── plugin.legend.tests.js
│ │ ├── plugin.title.tests.js
│ │ ├── scale.category.tests.js
│ │ ├── scale.linear.tests.js
│ │ ├── scale.logarithmic.tests.js
│ │ ├── scale.radialLinear.tests.js
│ │ └── scale.time.tests.js
│ ├── font-awesome
│ ├── .bower.json
│ ├── .gitignore
│ ├── .npmignore
│ ├── HELP-US-OUT.txt
│ ├── bower.json
│ ├── css
│ │ ├── font-awesome.css
│ │ ├── font-awesome.css.map
│ │ └── font-awesome.min.css
│ ├── fonts
│ │ ├── FontAwesome.otf
│ │ ├── fontawesome-webfont.eot
│ │ ├── fontawesome-webfont.svg
│ │ ├── fontawesome-webfont.ttf
│ │ ├── fontawesome-webfont.woff
│ │ └── fontawesome-webfont.woff2
│ ├── less
│ │ ├── animated.less
│ │ ├── bordered-pulled.less
│ │ ├── core.less
│ │ ├── fixed-width.less
│ │ ├── font-awesome.less
│ │ ├── icons.less
│ │ ├── larger.less
│ │ ├── list.less
│ │ ├── mixins.less
│ │ ├── path.less
│ │ ├── rotated-flipped.less
│ │ ├── screen-reader.less
│ │ ├── stacked.less
│ │ └── variables.less
│ └── scss
│ │ ├── _animated.scss
│ │ ├── _bordered-pulled.scss
│ │ ├── _core.scss
│ │ ├── _fixed-width.scss
│ │ ├── _icons.scss
│ │ ├── _larger.scss
│ │ ├── _list.scss
│ │ ├── _mixins.scss
│ │ ├── _path.scss
│ │ ├── _rotated-flipped.scss
│ │ ├── _screen-reader.scss
│ │ ├── _stacked.scss
│ │ ├── _variables.scss
│ │ └── font-awesome.scss
│ └── jquery
│ ├── .bower.json
│ ├── AUTHORS.txt
│ ├── LICENSE.txt
│ ├── README.md
│ ├── bower.json
│ ├── dist
│ ├── core.js
│ ├── jquery.js
│ ├── jquery.min.js
│ ├── jquery.min.map
│ ├── jquery.slim.js
│ ├── jquery.slim.min.js
│ └── jquery.slim.min.map
│ ├── external
│ └── sizzle
│ │ ├── LICENSE.txt
│ │ └── dist
│ │ ├── sizzle.js
│ │ ├── sizzle.min.js
│ │ └── sizzle.min.map
│ └── src
│ ├── .eslintrc.json
│ ├── ajax.js
│ ├── ajax
│ ├── jsonp.js
│ ├── load.js
│ ├── parseXML.js
│ ├── script.js
│ ├── var
│ │ ├── location.js
│ │ ├── nonce.js
│ │ └── rquery.js
│ └── xhr.js
│ ├── attributes.js
│ ├── attributes
│ ├── attr.js
│ ├── classes.js
│ ├── prop.js
│ ├── support.js
│ └── val.js
│ ├── callbacks.js
│ ├── core.js
│ ├── core
│ ├── DOMEval.js
│ ├── access.js
│ ├── init.js
│ ├── nodeName.js
│ ├── parseHTML.js
│ ├── ready-no-deferred.js
│ ├── ready.js
│ ├── readyException.js
│ ├── stripAndCollapse.js
│ ├── support.js
│ └── var
│ │ └── rsingleTag.js
│ ├── css.js
│ ├── css
│ ├── addGetHookIf.js
│ ├── adjustCSS.js
│ ├── curCSS.js
│ ├── hiddenVisibleSelectors.js
│ ├── showHide.js
│ ├── support.js
│ └── var
│ │ ├── cssExpand.js
│ │ ├── getStyles.js
│ │ ├── isHiddenWithinTree.js
│ │ ├── rmargin.js
│ │ ├── rnumnonpx.js
│ │ └── swap.js
│ ├── data.js
│ ├── data
│ ├── Data.js
│ └── var
│ │ ├── acceptData.js
│ │ ├── dataPriv.js
│ │ └── dataUser.js
│ ├── deferred.js
│ ├── deferred
│ └── exceptionHook.js
│ ├── deprecated.js
│ ├── dimensions.js
│ ├── effects.js
│ ├── effects
│ ├── Tween.js
│ └── animatedSelector.js
│ ├── event.js
│ ├── event
│ ├── ajax.js
│ ├── alias.js
│ ├── focusin.js
│ ├── support.js
│ └── trigger.js
│ ├── exports
│ ├── amd.js
│ └── global.js
│ ├── jquery.js
│ ├── manipulation.js
│ ├── manipulation
│ ├── _evalUrl.js
│ ├── buildFragment.js
│ ├── getAll.js
│ ├── setGlobalEval.js
│ ├── support.js
│ ├── var
│ │ ├── rcheckableType.js
│ │ ├── rscriptType.js
│ │ └── rtagName.js
│ └── wrapMap.js
│ ├── offset.js
│ ├── queue.js
│ ├── queue
│ └── delay.js
│ ├── selector-native.js
│ ├── selector-sizzle.js
│ ├── selector.js
│ ├── serialize.js
│ ├── traversing.js
│ ├── traversing
│ ├── findFilter.js
│ └── var
│ │ ├── dir.js
│ │ ├── rneedsContext.js
│ │ └── siblings.js
│ ├── var
│ ├── ObjectFunctionString.js
│ ├── arr.js
│ ├── class2type.js
│ ├── concat.js
│ ├── document.js
│ ├── documentElement.js
│ ├── fnToString.js
│ ├── getProto.js
│ ├── hasOwn.js
│ ├── indexOf.js
│ ├── pnum.js
│ ├── push.js
│ ├── rcssNum.js
│ ├── rnothtmlwhite.js
│ ├── slice.js
│ ├── support.js
│ └── toString.js
│ └── wrap.js
├── src
├── config
│ ├── dbconfig.json
│ └── navconfig.json
├── modules
│ └── sqldevops.js
├── routes
│ ├── API
│ │ ├── diskusage.js
│ │ └── topqueriesbyaveragecpu.js
│ ├── backuphistory.js
│ ├── dbsize.js
│ ├── directory.js
│ ├── index.js
│ ├── queryperf.js
│ ├── servermemorybydb.js
│ ├── tablespacedetail.js
│ └── users.js
├── sample
│ ├── bug.js
│ └── preparedstatmentroute.js
├── sql
│ ├── backuphistory.sql
│ ├── cpumetric.sql
│ ├── customers_wwi.sql
│ ├── db_size.sql
│ ├── directory.sql
│ ├── diskusage.sql
│ ├── iometric.sql
│ ├── queryperf.sql
│ ├── ring_buffer.sql
│ ├── servermemorybydb.sql
│ ├── tablespace.sql
│ ├── users.sql
│ ├── waits.sql
│ └── waits_paul_randal.sql
└── views
│ ├── backuphistory.ejs
│ ├── dbsize.ejs
│ ├── directory.ejs
│ ├── error.ejs
│ ├── index.ejs
│ ├── queryperf.ejs
│ ├── servermemorybydb.ejs
│ ├── tablespacedetail.ejs
│ └── users.ejs
└── vsts-docker-images.txt
/.dockerignore:
--------------------------------------------------------------------------------
1 | docker-compose.yml
2 | Dockerfile
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | web_app/node_modules
2 | db/bin
3 | db/obj
4 | /db_tests/WideWorldImporters/debug
5 | nul
6 | /test_runner/node_modules
7 | *.bak
8 | *.deb
9 | *.swp
10 |
--------------------------------------------------------------------------------
/data_sanitization/_archieve/create_user.sql:
--------------------------------------------------------------------------------
1 | USE [master]
2 | create login scripter with password = 'SqlDevOps2017'
3 | go
4 |
5 | USE [AdventureWorks]
6 | GO
7 | create user scripter for login scripter
8 | go
9 |
10 | ALTER ROLE [db_datareader] ADD MEMBER [scripter]
11 | GO
12 | ALTER ROLE [db_datawriter] ADD MEMBER [scripter]
13 | GO
14 | ALTER ROLE [db_ddladmin] ADD MEMBER [scripter]
15 | GO
16 | GRANT VIEW DEFINITION TO [scripter]
17 | GO
18 | print(N'Successfully created user: scripter without UNMASK permission on AdventureWorks database');
--------------------------------------------------------------------------------
/data_sanitization/_archieve/createdb.sql:
--------------------------------------------------------------------------------
1 | -- Create a new database called 'AdventureWorks'
2 | -- Connect to the 'master' database to run this snippet
3 | USE master
4 | GO
5 | -- Create the new database if it does not exist already
6 | -- Uncomment the ALTER DATABASE statement below to set the database to SINGLE_USER mode if the drop database command fails because the database is in use.
7 | --ALTER DATABASE AdventureWorks SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
8 | --GO
9 | -- Drop the database if it exists
10 | IF EXISTS (
11 | SELECT name
12 | FROM sys.databases
13 | WHERE name = N'AdventureWorks'
14 | )
15 | DROP DATABASE AdventureWorks
16 | GO
17 |
18 | CREATE DATABASE AdventureWorks
19 | GO
20 |
--------------------------------------------------------------------------------
/data_sanitization/_archieve/ddm.sql:
--------------------------------------------------------------------------------
1 | USE AdventureWorks
2 | Go
3 |
4 | ALTER TABLE HumanResources.Employee
5 | ALTER COLUMN NationalIDNumber ADD MASKED WITH (FUNCTION = 'default()')
6 |
7 | ALTER TABLE HumanResources.Employee
8 | ALTER COLUMN LoginID ADD MASKED WITH (FUNCTION = 'default()')
9 |
10 | ALTER TABLE HumanResources.Employee
11 | ALTER COLUMN BirthDate ADD MASKED WITH (FUNCTION = 'default()')
12 |
13 | ALTER TABLE HumanResources.Employee
14 | ALTER COLUMN MaritalStatus ADD MASKED WITH (FUNCTION = 'default()')
15 |
16 | ALTER TABLE Person.EmailAddress
17 | ALTER COLUMN EmailAddress ADD MASKED WITH (FUNCTION = 'email()');
18 |
19 | ALTER TABLE Person.PersonPhone
20 | ALTER COLUMN PhoneNumber ADD MASKED WITH (FUNCTION = 'partial(5,"XXXXXXX",0)');
21 |
--------------------------------------------------------------------------------
/data_sanitization/_archieve/get_default_path.sql:
--------------------------------------------------------------------------------
1 | SELECT
2 | SERVERPROPERTY('instancedefaultdatapath') AS [DefaultFile],
3 | SERVERPROPERTY('instancedefaultlogpath') AS [DefaultLog]
4 |
--------------------------------------------------------------------------------
/data_sanitization/_archieve/mssql-scripter.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # script out a subset of database that application needs
4 | /usr/local/bin/mssql-scripter -S localhost -d AdventureWorks -U scripter -P SqlDevOps2017 --include-objects HumanResources.uspGetDirectReports HumanResources.uspGetDirectManager --include-dependencies --include-types Schema --exclude-extended-properties --schema-and-data --script-create -f ./script.sql
5 |
6 |
--------------------------------------------------------------------------------
/data_sanitization/_archieve/mssql_scripter.ps1:
--------------------------------------------------------------------------------
1 |
2 |
3 | rm ./script.sql
4 |
5 | write-host "** scripting database ..."
6 | # script out a subset of database that application needs
7 | /usr/local/bin/mssql-scripter -S localhost -d AdventureWorks -U scripter -P SqlDevOps2017 --include-objects HumanResources.uspGetDirectReports HumanResources.uspGetDirectManager --include-dependencies --include-types Schema --exclude-extended-properties --schema-and-data --script-create -f ./script.sql
8 |
9 | write-host "** find and replace db name ..."
10 | # regex replace if needed
11 | gci -Path script.sql | ForEach-Object {( Get-Content -Path $_.FullName ) -replace 'AdventureWorks', 'devdb' | set-content $_.fullname }
12 |
--------------------------------------------------------------------------------
/data_sanitization/_archieve/restore.sql:
--------------------------------------------------------------------------------
1 |
2 | RESTORE DATABASE [AdventureWorks]
3 | FROM DISK = N'/azurebackups/AdventureWorks_Linux.bak' with recovery, replace
4 |
--------------------------------------------------------------------------------
/data_sanitization/_archieve/restore_demo.sql:
--------------------------------------------------------------------------------
1 | RESTORE DATABASE [AdventureWorks] FROM DISK = N'/backups/AdventureWorks_Linux.bak' with recovery, replace
2 | print(N'Successfully restored AdventureWorks');
3 |
--------------------------------------------------------------------------------
/data_sanitization/_archieve/restore_wwi.sql:
--------------------------------------------------------------------------------
1 | RESTORE DATABASE [WideWorldImporters] FROM DISK = N'/var/opt/mssql/backup/WorldWideImporters2017.bak' with recovery, replace
2 | print(N'Successfully restored WideWorldImporters');
3 |
--------------------------------------------------------------------------------
/data_sanitization/bash/wwi_script_schema_only.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | mssql-scripter -Slocalhost -dWideWorldImporters -Usa -PSqlDevOps2017 > wwi.sql
4 |
5 |
--------------------------------------------------------------------------------
/data_sanitization/create_unittest_db_demo.ps1:
--------------------------------------------------------------------------------
1 |
2 | sqlcmd -S $hostname -Usa -P SqlDevOps2017 -i ./sql/restore.sql
3 |
4 | sqlcmd -S $hostname -dWideWorldImporters -U sa -P SqlDevOps2017 -i ./sql/dynamic_data_masking.sql
5 |
6 | mssql-scripter -S $hostname -dWideWorldImporters -Usa -PSqlDevOps2017 > ./out/create_wwi.sql
7 |
8 | powershell bcp_out_reference_tables.ps1
9 |
10 | sqlcmd -S $hostname -Usa -PSqlDevOps2017 -i ./out/create_wwi.sql
11 |
12 | powershell bcp_in_reference_tables.ps1
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/data_sanitization/out/.lost_n_found:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/data_sanitization/out/.lost_n_found
--------------------------------------------------------------------------------
/data_sanitization/sanitize_database.ps1:
--------------------------------------------------------------------------------
1 |
2 | sqlcmd -S $hostname -Usa -P SqlDevOps2017 -i ./sql/restore.sql
3 |
4 | sqlcmd -S $hostname -dWideWorldImporters -U sa -P SqlDevOps2017 -i ./sql/dynamic_data_masking.sql
5 |
6 | mssql-scripter -S $hostname -dWideWorldImporters -Usa -PSqlDevOps2017 > ./out/create_wwi.sql
7 |
8 | ./bcp_out_reference_tables.ps1
9 |
10 | sqlcmd -S $hostname -Usa -PSqlDevOps2017 -i ./out/create_wwi.sql
11 |
12 | ./bcp_in_reference_tables.ps1
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/data_sanitization/sql/adventureworks-restore.sql:
--------------------------------------------------------------------------------
1 | RESTORE DATABASE [AdventureWorks]
2 | FROM DISK = N'/var/opt/mssql/backup/AdventureWorks2014.bak'
3 | WITH FILE = 1, MOVE N'AdventureWorks2014_Data'
4 | TO N'/var/opt/mssql/data/AdventureWorks_Data.mdf',
5 | MOVE N'AdventureWorks2014_Log'
6 | TO N'/var/opt/mssql/data/AdventureWorks_Log.ldf', NOUNLOAD, STATS = 5
7 |
--------------------------------------------------------------------------------
/data_sanitization/sql/create_user.sql:
--------------------------------------------------------------------------------
1 | USE [master]
2 | create login scripter with password = 'SqlDevOps2017'
3 | go
4 |
5 | USE [WideWorldImporters]
6 | GO
7 | create user scripter for login scripter
8 | go
9 |
10 | ALTER ROLE [db_datareader] ADD MEMBER [scripter]
11 | GO
12 | ALTER ROLE [db_datawriter] ADD MEMBER [scripter]
13 | GO
14 | ALTER ROLE [db_ddladmin] ADD MEMBER [scripter]
15 | GO
16 | GRANT VIEW DEFINITION TO [scripter]
17 | GO
18 | print(N'Successfully created user: scripter without UNMASK permission on WideWorldImporters database');
--------------------------------------------------------------------------------
/data_sanitization/sql/ddm.sql:
--------------------------------------------------------------------------------
1 | USE WideWorldImporters
2 | Go
3 |
4 | ALTER TABLE Application.People
5 | ALTER COLUMN EmailAddress ADD MASKED WITH (FUNCTION = 'email()');
6 |
7 | ALTER TABLE Application.People
8 | ALTER COLUMN FaxNumber ADD MASKED WITH (FUNCTION = 'default()');
9 |
10 | ALTER TABLE Application.People
11 | ALTER COLUMN PhoneNumber ADD MASKED WITH (FUNCTION = 'default()');
12 |
--------------------------------------------------------------------------------
/data_sanitization/sql/drop_preprod.sql:
--------------------------------------------------------------------------------
1 | -- Drop the database 'WideWorldImporters'
2 | -- Connect to the 'master' database to run this snippet
3 | USE master
4 | GO
5 | -- Uncomment the ALTER DATABASE statement below to set the database to SINGLE_USER mode if the drop database command fails because the database is in use.
6 | ALTER DATABASE WideWorldImporters SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
7 | -- Drop the database if it exists
8 | IF EXISTS (
9 | SELECT name
10 | FROM sys.databases
11 | WHERE name = N'WideWorldImporters'
12 | )
13 | DROP DATABASE WideWorldImporters
14 | GO
--------------------------------------------------------------------------------
/data_sanitization/sql/drop_testdb.sql:
--------------------------------------------------------------------------------
1 | -- Drop the database 'WideWorldImportersTest'
2 | -- Connect to the 'master' database to run this snippet
3 | USE master
4 | GO
5 | -- Uncomment the ALTER DATABASE statement below to set the database to SINGLE_USER mode if the drop database command fails because the database is in use.
6 | ALTER DATABASE WideWorldImportersTest SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
7 | -- Drop the database if it exists
8 | IF EXISTS (
9 | SELECT name
10 | FROM sys.databases
11 | WHERE name = N'WideWorldImportersTest'
12 | )
13 | DROP DATABASE WideWorldImportersTest
14 | GO
--------------------------------------------------------------------------------
/data_sanitization/sql/restore.sql:
--------------------------------------------------------------------------------
1 | RESTORE DATABASE WideWorldImporters FROM DISK = "/var/opt/mssql/backup/WideWorldImporters-Full.bak"
2 | WITH MOVE "WWI_Primary" TO "/var/opt/mssql/data/WideWorldImporters.mdf",
3 | MOVE "WWI_Userdata" TO "/var/opt/mssql/data/WideWorldImporters_Userdata.mdf",
4 | MOVE "WWI_Log" TO "/var/opt/mssql/data/WideWorldImporters.ldf", MOVE "WWI_InMemory_Data_1"
5 | TO "/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1"
--------------------------------------------------------------------------------
/db/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_STORE
2 | bin
3 | obj
--------------------------------------------------------------------------------
/db/AdventureWorks.sqlproj.user:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/db/publish_profiles/localdev.publish.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | True
5 | AdventureWorks
6 | AdventureWorks.sql
7 | Data Source=localhost;Integrated Security=True;Connect Timeout=60;Encrypt=False;TrustServerCertificate=True
8 | 1
9 |
10 |
--------------------------------------------------------------------------------
/db/src/misc/dbo.AccountNumber.UserDefinedDataType.sql:
--------------------------------------------------------------------------------
1 | /* ==Scripting Parameters==
2 |
3 | Source Server Version : Version130 (13.0.1601)
4 | Source Database Engine Edition : Enterprise
5 | Source Database Engine Type : Standalone
6 |
7 | Target Server Version : Version130
8 | Target Database Engine Edition : Enterprise
9 | Target Database Engine Type : Standalone
10 | */
11 | /****** Object: UserDefinedDataType [dbo].[AccountNumber] Script Date: 7/16/17 5:38:14 PM ******/
12 | CREATE TYPE [dbo].[AccountNumber] FROM [nvarchar](15) NULL
13 | GO
14 |
--------------------------------------------------------------------------------
/db/src/misc/dbo.Flag.UserDefinedDataType.sql:
--------------------------------------------------------------------------------
1 | /* ==Scripting Parameters==
2 |
3 | Source Server Version : Version130 (13.0.1601)
4 | Source Database Engine Edition : Enterprise
5 | Source Database Engine Type : Standalone
6 |
7 | Target Server Version : Version130
8 | Target Database Engine Edition : Enterprise
9 | Target Database Engine Type : Standalone
10 | */
11 | /****** Object: UserDefinedDataType [dbo].[Flag] Script Date: 7/16/17 5:38:14 PM ******/
12 | CREATE TYPE [dbo].[Flag] FROM [bit] NOT NULL
13 | GO
14 |
--------------------------------------------------------------------------------
/db/src/misc/dbo.Name.UserDefinedDataType.sql:
--------------------------------------------------------------------------------
1 | /* ==Scripting Parameters==
2 |
3 | Source Server Version : Version130 (13.0.1601)
4 | Source Database Engine Edition : Enterprise
5 | Source Database Engine Type : Standalone
6 |
7 | Target Server Version : Version130
8 | Target Database Engine Edition : Enterprise
9 | Target Database Engine Type : Standalone
10 | */
11 | /****** Object: UserDefinedDataType [dbo].[Name] Script Date: 7/16/17 5:38:14 PM ******/
12 | CREATE TYPE [dbo].[Name] FROM [nvarchar](50) NULL
13 | GO
14 |
--------------------------------------------------------------------------------
/db/src/misc/dbo.NameStyle.UserDefinedDataType.sql:
--------------------------------------------------------------------------------
1 | /* ==Scripting Parameters==
2 |
3 | Source Server Version : Version130 (13.0.1601)
4 | Source Database Engine Edition : Enterprise
5 | Source Database Engine Type : Standalone
6 |
7 | Target Server Version : Version130
8 | Target Database Engine Edition : Enterprise
9 | Target Database Engine Type : Standalone
10 | */
11 | /****** Object: UserDefinedDataType [dbo].[NameStyle] Script Date: 7/16/17 5:38:14 PM ******/
12 | CREATE TYPE [dbo].[NameStyle] FROM [bit] NOT NULL
13 | GO
14 |
--------------------------------------------------------------------------------
/db/src/misc/dbo.OrderNumber.UserDefinedDataType.sql:
--------------------------------------------------------------------------------
1 | /* ==Scripting Parameters==
2 |
3 | Source Server Version : Version130 (13.0.1601)
4 | Source Database Engine Edition : Enterprise
5 | Source Database Engine Type : Standalone
6 |
7 | Target Server Version : Version130
8 | Target Database Engine Edition : Enterprise
9 | Target Database Engine Type : Standalone
10 | */
11 | /****** Object: UserDefinedDataType [dbo].[OrderNumber] Script Date: 7/16/17 5:38:14 PM ******/
12 | CREATE TYPE [dbo].[OrderNumber] FROM [nvarchar](25) NULL
13 | GO
14 |
--------------------------------------------------------------------------------
/db/src/misc/dbo.Phone.UserDefinedDataType.sql:
--------------------------------------------------------------------------------
1 | /* ==Scripting Parameters==
2 |
3 | Source Server Version : Version130 (13.0.1601)
4 | Source Database Engine Edition : Enterprise
5 | Source Database Engine Type : Standalone
6 |
7 | Target Server Version : Version130
8 | Target Database Engine Edition : Enterprise
9 | Target Database Engine Type : Standalone
10 | */
11 | /****** Object: UserDefinedDataType [dbo].[Phone] Script Date: 7/16/17 5:38:14 PM ******/
12 | CREATE TYPE [dbo].[Phone] FROM [nvarchar](25) NULL
13 | GO
14 |
--------------------------------------------------------------------------------
/db/src/security/HumanResources.Schema.sql:
--------------------------------------------------------------------------------
1 | /* ==Scripting Parameters==
2 |
3 | Source Server Version : Version130 (13.0.1601)
4 | Source Database Engine Edition : Enterprise
5 | Source Database Engine Type : Standalone
6 |
7 | Target Server Version : Version130
8 | Target Database Engine Edition : Enterprise
9 | Target Database Engine Type : Standalone
10 | */
11 | /****** Object: Schema [HumanResources] Script Date: 7/16/17 5:38:14 PM ******/
12 | CREATE SCHEMA [HumanResources]
13 | GO
14 | EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Contains objects related to employees and departments.' , @level0type=N'SCHEMA',@level0name=N'HumanResources'
15 | GO
16 |
--------------------------------------------------------------------------------
/db/src/security/Person.Schema.sql:
--------------------------------------------------------------------------------
1 | /* ==Scripting Parameters==
2 |
3 | Source Server Version : Version130 (13.0.1601)
4 | Source Database Engine Edition : Enterprise
5 | Source Database Engine Type : Standalone
6 |
7 | Target Server Version : Version130
8 | Target Database Engine Edition : Enterprise
9 | Target Database Engine Type : Standalone
10 | */
11 | /****** Object: Schema [Person] Script Date: 7/16/17 5:38:14 PM ******/
12 | CREATE SCHEMA [Person]
13 | GO
14 | EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Contains objects related to names and addresses of customers, vendors, and employees' , @level0type=N'SCHEMA',@level0name=N'Person'
15 | GO
16 |
--------------------------------------------------------------------------------
/db/src/security/Production.Schema.sql:
--------------------------------------------------------------------------------
1 | /* ==Scripting Parameters==
2 |
3 | Source Server Version : Version130 (13.0.1601)
4 | Source Database Engine Edition : Enterprise
5 | Source Database Engine Type : Standalone
6 |
7 | Target Server Version : Version130
8 | Target Database Engine Edition : Enterprise
9 | Target Database Engine Type : Standalone
10 | */
11 | /****** Object: Schema [Production] Script Date: 7/16/17 5:38:14 PM ******/
12 | CREATE SCHEMA [Production]
13 | GO
14 | EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Contains objects related to products, inventory, and manufacturing.' , @level0type=N'SCHEMA',@level0name=N'Production'
15 | GO
16 |
--------------------------------------------------------------------------------
/db/src/security/Purchasing.Schema.sql:
--------------------------------------------------------------------------------
1 | /* ==Scripting Parameters==
2 |
3 | Source Server Version : Version130 (13.0.1601)
4 | Source Database Engine Edition : Enterprise
5 | Source Database Engine Type : Standalone
6 |
7 | Target Server Version : Version130
8 | Target Database Engine Edition : Enterprise
9 | Target Database Engine Type : Standalone
10 | */
11 | /****** Object: Schema [Purchasing] Script Date: 7/16/17 5:38:14 PM ******/
12 | CREATE SCHEMA [Purchasing]
13 | GO
14 | EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Contains objects related to vendors and purchase orders.' , @level0type=N'SCHEMA',@level0name=N'Purchasing'
15 | GO
16 |
--------------------------------------------------------------------------------
/db/src/security/Sales.Schema.sql:
--------------------------------------------------------------------------------
1 | /* ==Scripting Parameters==
2 |
3 | Source Server Version : Version130 (13.0.1601)
4 | Source Database Engine Edition : Enterprise
5 | Source Database Engine Type : Standalone
6 |
7 | Target Server Version : Version130
8 | Target Database Engine Edition : Enterprise
9 | Target Database Engine Type : Standalone
10 | */
11 | /****** Object: Schema [Sales] Script Date: 7/16/17 5:38:14 PM ******/
12 | CREATE SCHEMA [Sales]
13 | GO
14 | EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Contains objects related to customers, sales orders, and sales territories.' , @level0type=N'SCHEMA',@level0name=N'Sales'
15 | GO
16 |
--------------------------------------------------------------------------------
/db/utils/build.ps1:
--------------------------------------------------------------------------------
1 |
2 |
3 | msbuild.exe -t:build AdventureWorks.sqlproj
--------------------------------------------------------------------------------
/db/utils/importdb.ps1:
--------------------------------------------------------------------------------
1 |
2 |
3 | mssql-scripter -S localhost -d AdventureWorks --file-per-object --script-create --exclude-use-database --display-progress -f .\src
4 |
5 | gci -Path ./src/*.sql | ForEach-Object { ( Get-Content -Path $_.FullName ) -replace 'SET.*(ON|OFF)$', '' | set-content $_.fullname }
6 |
7 | rm ./src/*.Database.sql
8 |
9 | move ./src/*.Table.sql ./src/tables
10 | move ./src/*.View.sql ./src/views
11 | move ./src/*.Type.sql ./src/types
12 | move ./src/*Function.sql ./src/functions
13 | move ./src/*Procedure.sql ./src/procedures
14 | move ./src/*User.sql ./src/security
15 | move ./src/*Schema.sql ./src/security
16 | move ./src/*.sql ./src/misc
17 |
--------------------------------------------------------------------------------
/db/utils/publish.ps1:
--------------------------------------------------------------------------------
1 |
2 | msbuild.exe /t:publish /p:SqlPublishProfilePath="publish_profiles\localdev.publish.xml"
3 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/_seed_sequence.md:
--------------------------------------------------------------------------------
1 |
2 | Unittest data seeding sequence based on FK reference.
3 |
4 | * businessentity
5 | * person
6 | * employee
7 | * department
8 | * shift
9 | * emailaddress
10 | * phonenumbertype
11 | * personphone
12 | * countryregion
13 | * salesterritory
14 | * stateprovince
15 | * addresstype
16 | * addressrename
17 | * businessentityaddress
18 | * employeedepartmenthistory
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/seed_humanresources_department.csv:
--------------------------------------------------------------------------------
1 | DepartmentID,Name,GroupName,ModifiedDate
2 | 1,Engineering,Research and Development,2008-04-30 00:00:00.000
3 | 16,Executive,Executive General and Administration,2008-04-30 00:00:00.000
4 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/seed_humanresources_employee.csv:
--------------------------------------------------------------------------------
1 | BusinessEntityID,NationalIDNumber,LoginID,OrganizationNode,JobTitle,BirthDate,MaritalStatus,Gender,HireDate,SalariedFlag,VacationHours,SickLeaveHours,CurrentFlag,rowguid,ModifiedDate
2 | 1,295847284,adventure-works\ken0,/,Chief Executive Officer,1969-01-29,S,M,2009-01-14,1,99,69,1,f01251e5-96a3-448d-981e-0f99d789110d,2014-06-30 00:00:00.000
3 | 2,245797967,adventure-works\terri0,/1/,Vice President of Engineering,1971-08-01,S,F,2008-01-31,1,1,20,1,45e8f437-670d-4409-93cb-f9424a40d6ee,2014-06-30 00:00:00.000
4 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/seed_humanresources_employeedepartmenthistory.csv:
--------------------------------------------------------------------------------
1 | BusinessEntityID,DepartmentID,ShiftID,StartDate,EndDate,ModifiedDate
2 | 1,16,1,2009-01-14,,2009-01-13 00:00:00.000
3 | 2,1,1,2008-01-31,,2008-01-30 00:00:00.000
4 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/seed_humanresources_shift.csv:
--------------------------------------------------------------------------------
1 | ShiftID,Name,StartTime,EndTime,ModifiedDate
2 | 1,Day,07:00:00,15:00:00,2008-04-30 00:00:00.000
3 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/seed_person_addressrename.csv:
--------------------------------------------------------------------------------
1 | AddressID,AddressLine1,AddressLine2,City,StateProvinceID,PostalCode,SpatialLocation,rowguid,ModifiedDate
2 | 249,4350 Minute Dr.,,Newport Hills,79,98006,,a120e049-aeca-4a01-8f05-b36301016b7c,2009-01-07 00:00:00.000
3 | 293,7559 Worth Ct.,,Renton,79,98055,,f9e3e4d2-d3b9-465a-b91a-9656ed0f98ab,2008-01-24 00:00:00.000
4 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/seed_person_addresstype.csv:
--------------------------------------------------------------------------------
1 | AddressTypeID,Name,rowguid,ModifiedDate
2 | 2,Home,41bc2ff6-f0fc-475f-8eb9-cec0805aa0f2,2008-04-30 00:00:00.000
3 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/seed_person_businessentity.csv:
--------------------------------------------------------------------------------
1 | BusinessEntityID,rowguid,ModifiedDate
2 | 1,0c7d8f81-d7b1-4cf0-9c0a-4cd8b6b50087,2017-12-13 13:20:24.150
3 | 2,6648747f-7843-4002-b317-65389684c398,2017-12-13 13:20:24.430
4 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/seed_person_businessentityaddress.csv:
--------------------------------------------------------------------------------
1 | BusinessEntityID,AddressID,AddressTypeID,rowguid,ModifiedDate
2 | 1,249,2,3a5d0a00-6739-4dfe-a8f7-844cd9dee3df,2014-09-12 11:15:06.967
3 | 2,293,2,84ae7057-edf4-4c51-8b8d-3aeaefbfb4a1,2014-09-12 11:15:06.967
4 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/seed_person_countryregion.csv:
--------------------------------------------------------------------------------
1 | CountryRegionCode,Name,ModifiedDate
2 | US,United States,2008-04-30 00:00:00.000
3 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/seed_person_emailaddress.csv:
--------------------------------------------------------------------------------
1 | BusinessEntityID,EmailAddressID,EmailAddress,rowguid,ModifiedDate
2 | 1,1,ken0@adventure-works.com,8a1901e4-671b-431a-871c-eadb2942e9ee,2009-01-07 00:00:00.000
3 | 2,2,terri0@adventure-works.com,b5ff9efd-72a2-4f87-830b-f338fdd4d162,2008-01-24 00:00:00.000
4 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/seed_person_person.csv:
--------------------------------------------------------------------------------
1 | BusinessEntityID,PersonType,NameStyle,Title,FirstName,MiddleName,LastName,Suffix,EmailPromotion,AdditionalContactInfo,Demographics,rowguid,ModifiedDate
2 | 1,EM,0,,Ken,J,Sánchez,,0,,,92c4279f-1207-48a3-8448-4636514eb7e2,2009-01-07 00:00:00.000
3 | 2,EM,0,,Terri,Lee,Duffy,,1,,,d8763459-8aa8-47cc-aff7-c9079af79033,2008-01-24 00:00:00.000
4 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/seed_person_personphone.csv:
--------------------------------------------------------------------------------
1 | BusinessEntityID,PhoneNumber,PhoneNumberTypeID,ModifiedDate
2 | 1,697-555-0142,1,2009-01-07 00:00:00.000
3 | 2,819-555-0175,3,2008-01-24 00:00:00.000
4 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/seed_person_phonenumbertype.csv:
--------------------------------------------------------------------------------
1 | PhoneNumberTypeID,Name,ModifiedDate
2 | 1,Cell,2017-12-13 13:19:22.273
3 | 3,Work,2017-12-13 13:19:22.273
4 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/seed_person_stateprovince.csv:
--------------------------------------------------------------------------------
1 | StateProvinceID,StateProvinceCode,CountryRegionCode,IsOnlyStateProvinceFlag,Name,TerritoryID,rowguid,ModifiedDate
2 | 79,"WA ",US,0,Washington,1,16274df0-6f05-43a6-bc18-ad171017a1eb,2014-02-08 10:17:21.587
3 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/seed_data/seed_sales_salesterritory.csv:
--------------------------------------------------------------------------------
1 | TerritoryID,Name,CountryRegionCode,Group,SalesYTD,SalesLastYear,CostYTD,CostLastYear,rowguid,ModifiedDate
2 | 1,Northwest,US,North America,7887186.7882,3298694.4938,0.0000,0.0000,43689a10-e30b-497f-b0de-11de20267ff7,2008-04-30 00:00:00.000
3 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/uspGetDirectManager_expected_result_for_businessentityid_2.csv:
--------------------------------------------------------------------------------
1 | BusinessEntityID,NationalIDNumber,LoginID,OrganizationNode,OrganizationLevel,Title,FirstName,MiddleName,LastName,Suffix,JobTitle,PhoneNumber,PhoneNumberType,EmailAddress,EmailPromotion,AddressLine1,AddressLine2,City,StateProvinceName,PostalCode,CountryRegionName,AdditionalContactInfo,DepartmentID,GroupName,DepartmentName
2 | 1,295847284,adventure-works\ken0,0x,0,,Ken,J,Sánchez,,Chief Executive Officer,697-555-0142,Cell,ken0@adventure-works.com,0,4350 Minute Dr.,,Newport Hills,Washington,98006,United States,,16,Executive General and Administration,Executive
3 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/adventureworks/uspGetDirectReports_expected_result_for_businessentityid_1.csv:
--------------------------------------------------------------------------------
1 | BusinessEntityID,NationalIDNumber,LoginID,OrganizationNode,OrganizationLevel,Title,FirstName,MiddleName,LastName,Suffix,JobTitle,PhoneNumber,PhoneNumberType,EmailAddress,EmailPromotion,AddressLine1,AddressLine2,City,StateProvinceName,PostalCode,CountryRegionName,AdditionalContactInfo,DepartmentID,GroupName,DepartmentName
2 | 2,245797967,adventure-works\terri0,58,1,,Terri,Lee,Duffy,,Vice President of Engineering,819-555-0175,Work,terri0@adventure-works.com,1,7559 Worth Ct.,,Renton,Washington,98055,United States,,1,Research and Development,Engineering
3 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/sample_1/my_table_expected_power_results.csv:
--------------------------------------------------------------------------------
1 | "x","y","power"
2 | "2","1","2"
3 | "3","2","9"
4 | "4","3","64"
5 | "5","4","625"
6 | "4","2","16"
7 | "3","3","27"
8 | "2","4","16"
9 | "1","5","1"
10 | "-1","2","1"
11 | "-2","5","-32"
12 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/sample_1/my_table_initial_data.csv:
--------------------------------------------------------------------------------
1 | "x","y"
2 | 2,1
3 | 3,2
4 | 4,3
5 | 5,4
6 | 4,2
7 | 3,3
8 | 2,4
9 | 1,5
10 | -1,2
11 | -2,5
12 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/data/sample_1/numbers_expected_output.csv:
--------------------------------------------------------------------------------
1 | "p","s"
2 | 2,34
3 | 12,44
4 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/database.yml:
--------------------------------------------------------------------------------
1 | # Database connection.
2 | # When Slacker is executed, it will attempt to connect to this database.
3 |
4 | # Replace the following with your connection information.
5 | # Note that at this point Slacker only works with SQL Server authentication.
6 | server: localhost
7 | database: AdventureWorks
8 | user: sa
9 | password: SqlDevOps2017
10 | port: 1433
11 | driver: tiny_tds
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/lib/helpers/my_helper.rb:
--------------------------------------------------------------------------------
1 | module MyHelper
2 | end
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/spec/uspGetDirectReports.rb:
--------------------------------------------------------------------------------
1 | # Method "describe" opens up an example group.
2 | describe 'uspGetDirectReports Tests' do
3 |
4 | # Test for getting direct reports and employee detail.
5 | it ' Testing uspGetDirectReports proc with @businessentityid = 1' do
6 | # Seed orgchart procs unittest mock data
7 | seed_orgchart_data()
8 |
9 | # matching with expected result data in csv
10 | expect(sql.adventureworks.exec_humanresources_uspGetDirectReports(:id => 1)).to match('adventureworks/uspGetDirectReports_expected_result_for_businessentityid_1.csv')
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/sql/adventureworks/exec_humanresources_uspGetDirectManager.sql.erb:
--------------------------------------------------------------------------------
1 | declare @BusinessEntityID int;
2 | set @BusinessEntityID = <%= options [:id]%>;
3 |
4 | exec HumanResources.uspGetDirectManager @BusinessEntityID
5 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/sql/adventureworks/exec_humanresources_uspGetDirectReports.sql.erb:
--------------------------------------------------------------------------------
1 | declare @BusinessEntityID int;
2 | set @BusinessEntityID = <%= options [:id]%>;
3 |
4 | exec HumanResources.uspGetDirectReports @BusinessEntityID
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/sql/sample_1/create_my_table.sql.erb:
--------------------------------------------------------------------------------
1 | create table MyTable(x int, y int);
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/sql/sample_1/my_table_on_power.sql.erb:
--------------------------------------------------------------------------------
1 | select x, y, convert(int, Power(x, y)) as [power]
2 | from MyTable;
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/sql/sample_1/play_with_numbers.sql.erb:
--------------------------------------------------------------------------------
1 | declare @x int;
2 | declare @y int;
3 |
4 | set @x = <%= options[:x]%>;
5 | set @y = <%= options[:y]%>;
6 |
7 | -- Return just the product of @x and @y
8 | select @x * @y [product] union all
9 | select 12;
10 |
11 | -- Return the numbers and their sum
12 | select @x x, @y y, @x + @y [sum];
13 |
14 | -- Get the two numbers in one column and their sum with 32 in another
15 | select @x p, @x + 32 s union all
16 | select @y p, @y + 32 s;
17 |
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/sql/sample_1/sysobjects.sql.erb:
--------------------------------------------------------------------------------
1 | select * from sysobjects where xtype = 'S';
--------------------------------------------------------------------------------
/db_tests/AdventureWorks/sql/sample_1/sysobjects_with_params.sql.erb:
--------------------------------------------------------------------------------
1 | <%# Every parameter passed to a SQL template appears in the options hash available to the template %>
2 | select * from sysobjects where xtype = '<%= options[:xtype] %>';
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/.dockerignore:
--------------------------------------------------------------------------------
1 | docker-compose.yml
2 | Dockerfile
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ericskang/mssql-slacker:latest
2 |
3 | WORKDIR /opt/var/slacker/wwi
4 |
5 | COPY . .
6 |
7 | RUN chmod +x ./runner.sh
8 | RUN chmod +x ./wait-for-it.sh
9 | CMD /bin/bash -c "tail -f /dev/null"
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/data/WideWorldImporters/customers/load/sales_customers.csv:
--------------------------------------------------------------------------------
1 | CustomerID,CustomerName,BillToCustomerID,CustomerCategoryID,BuyingGroupID,PrimaryContactPersonID,AlternateContactPersonID,DeliveryMethodID,DeliveryCityID,PostalCityID,CreditLimit,AccountOpenedDate,StandardDiscountPercentage,IsStatementSent,IsOnCreditHold,PaymentDays,PhoneNumber,FaxNumber,DeliveryRun,RunPosition,WebsiteURL,DeliveryAddressLine1,DeliveryAddressLine2,DeliveryPostalCode,DeliveryLocation,PostalAddressLine1,PostalAddressLine2,PostalPostalCode,LastEditedBy
2 | 1,Tailspin Toys (Head Office),1,3,1,1001,1002,3,19586,19586,,2013-01-01,0.000,0,0,7,(308) 555-0100,(308) 555-0101,,,http://www.tailspintoys.com,Shop 38,1877 Mittal Road,90410,POINT(-102.6201979 41.4972022),PO Box 8975,Ribeiroville,90410,1
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/data/WideWorldImporters/reference_data/match/application_people_personid_1.csv:
--------------------------------------------------------------------------------
1 | PersonID,FullName,PreferredName,SearchName
2 | 1,Data Conversion Only,Data Conversion Only,Data Conversion Only Data Conversion Only
3 |
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/data/sample_1/my_table_expected_power_results.csv:
--------------------------------------------------------------------------------
1 | "x","y","power"
2 | "2","1","2"
3 | "3","2","9"
4 | "4","3","64"
5 | "5","4","625"
6 | "4","2","16"
7 | "3","3","27"
8 | "2","4","16"
9 | "1","5","1"
10 | "-1","2","1"
11 | "-2","5","-32"
12 |
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/data/sample_1/my_table_initial_data.csv:
--------------------------------------------------------------------------------
1 | "x","y"
2 | 2,1
3 | 3,2
4 | 4,3
5 | 5,4
6 | 4,2
7 | 3,3
8 | 2,4
9 | 1,5
10 | -1,2
11 | -2,5
12 |
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/data/sample_1/numbers_expected_output.csv:
--------------------------------------------------------------------------------
1 | "p","s"
2 | 2,34
3 | 12,44
4 |
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/database.yml:
--------------------------------------------------------------------------------
1 | # Database connection.
2 | # When Slacker is executed, it will attempt to connect to this database.
3 |
4 | # Replace the following with your connection information.
5 | # Note that at this point Slacker only works with SQL Server authentication.
6 | server: mssql
7 | database: WideWorldImporters
8 | user: sa
9 | password: SqlDevOps2017
10 | driver: tiny_tds
11 | port: 1433
12 | console_enabled: false
13 |
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3'
2 | services:
3 | slacker:
4 | build: .
5 | depends_on:
6 | - mssql
7 | # command: ["./wait-for-it.sh", "mssql:1433", "--", "./runner.sh"]
8 | command: ["tail", "-f", "/dev/null"] # make slacker runner container up and running
9 | container_name: slacker_runner
10 | mssql:
11 | container_name: mssql_testdb
12 | image: sqldevopsacs.azurecr.io/mssql
13 | ports:
14 | - "1433:1433"
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/lib/helpers/my_helper.rb:
--------------------------------------------------------------------------------
1 | module MyHelper
2 | end
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/runner.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | slacker -fd ./spec/**/*.rb >> /dev/stdout
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/spec/customer/wwi_customer.rb:
--------------------------------------------------------------------------------
1 | describe 'WideWorldImporters database' do
2 | # it 'processes simple customer transaction data' do
3 | # expect(sql.WideWorldImporters.customer_transactions(:id => 832)).to match('WideWorldImporters/customer_transactions.csv');
4 | # end
5 |
6 | # it 'processes complex customer transaction' do
7 | # expect(sql.WideWorldImporters.customer_transactions_complex_data(:id => 832)).to match('WideWorldImporters/customer_transactions_complex_data.csv');
8 | # end
9 |
10 | it 'processes simple customer transaction data' do
11 | true
12 | end
13 |
14 | it 'processes complex customer transaction' do
15 | true
16 | end
17 |
18 | end
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/spec/reference_data/application_People.rb:
--------------------------------------------------------------------------------
1 | describe 'WideWorldImporters reference table: Application.People' do
2 | it 'contains PersonID == 1 as a template' do
3 | expect(sql.WideWorldImporters.reference_data.check_personid(:id => 1)).to match('WideWorldImporters/reference_data/match/application_people_personid_1.csv')
4 | end
5 | end
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/spec/test_perf_sample.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/db_tests/WideWorldImporters/spec/test_perf_sample.zip
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/spec/website/recordColdRoomTemperatures.rb:
--------------------------------------------------------------------------------
1 | describe 'WideWorldImporters: Website.RecordColdRoomTemperatures' do
2 | it 'successfully records the cold room temperature sensor readings' do
3 | true # raise ("todo")
4 | end
5 | end
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/spec/website/recordVehicleTemperature.rb:
--------------------------------------------------------------------------------
1 | describe 'WideWorldImporters: Website.RecordVehicleTemperature' do
2 | it 'successfully records the vehicle temperature sensor readings' do
3 | true # raise ("todo")
4 | end
5 | end
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/spec/website/searchForCustomers.rb:
--------------------------------------------------------------------------------
1 | describe 'WideWorldImporters: Website.SearchForCustomers' do
2 |
3 | it 'successfully find customers' do
4 | true # raise ("todo")
5 | end
6 |
7 | it 'fails with invalid customer information' do
8 | true # raise ("todo")
9 | end
10 |
11 | end
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/spec/website/searchForPeople.rb:
--------------------------------------------------------------------------------
1 | describe 'WideWorldImporters: Website.SearchForPeople' do
2 | it 'successfully finds people' do
3 | true # raise ("todo")
4 | end
5 |
6 | it 'fails with invalid people information' do
7 | true # raise ("todo")
8 | end
9 |
10 | end
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/spec/website/searchForStockItems.rb:
--------------------------------------------------------------------------------
1 | describe 'WideWorldImporters: Website.SearchForStockItems' do
2 |
3 | it 'successfully find a stock item' do
4 | true # raise ("todo")
5 | end
6 |
7 | it 'fails with invalid stock item information' do
8 | true # raise ("todo")
9 | end
10 |
11 |
12 | end
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/spec/website/searchForStockItemsByTags.rb:
--------------------------------------------------------------------------------
1 | describe 'WideWorldImporters: Website.SearchForStockItemsByTags' do
2 |
3 | it 'successfully find stock items by tags' do
4 | true # raise ("todo")
5 | end
6 |
7 | it 'fails with invalid tags' do
8 | true # raise ("todo")
9 | end
10 | end
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/spec/website/searchForSuppliers.rb:
--------------------------------------------------------------------------------
1 | describe 'WideWorldImporters: Website.SearchForSuppliers' do
2 |
3 | it 'successfully find suppliers' do
4 | true #raise ("unittest failure demonstration")
5 | end
6 |
7 | it 'fails with invalid supplier information' do
8 | true # raise ("todo")
9 | end
10 | end
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/sql/WideWorldImporters/customer_transactions.sql.erb:
--------------------------------------------------------------------------------
1 |
2 | select ct.CustomerID, ct.TransactionDate
3 | from sales.customertransactions ct
4 | where CustomerID = '<%= options[:id] %>'
5 | order by TransactionDate desc
6 |
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/sql/WideWorldImporters/customer_transactions_complex_data.sql.erb:
--------------------------------------------------------------------------------
1 |
2 | select ct.CustomerID, ct.TransactionAmount, ct.LastEditedWhen
3 | from sales.customertransactions ct
4 | where CustomerID = '<%= options[:id] %>'
5 | order by TransactionDate desc
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/sql/WideWorldImporters/reference_data/check_personid.sql.erb:
--------------------------------------------------------------------------------
1 | select
2 | p.PersonID,
3 | p.FullName,
4 | p.PreferredName,
5 | p.SearchName
6 | from Application.People p
7 | where p.PersonID = '<%= options[:id] %>'
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/sql/WideWorldImporters/test_perf_samples/wait_n_query.sql.erb:
--------------------------------------------------------------------------------
1 | -- waitfor delay '00:00:01'
2 |
3 | select top 1000 * from Application.People
4 | where IsSystemUser = 0
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/sql/WideWorldImporters/website/activateLogon.sql.erb:
--------------------------------------------------------------------------------
1 | exec Website.ActivateWebsiteLogon @PersonID = '<%= options[:PersonID] %>', @LogonName = '<%= options[:LogonName] %>', @InitialPassword = '<%= options[:Password] %>'
2 |
3 | select LogonName
4 | from Application.People
5 | where PersonID = '<%= options[:PersonID] %>' and LogonName = '<%= options[:LogonName] %>'
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/sql/WideWorldImporters/website/changePassword.sql.erb:
--------------------------------------------------------------------------------
1 | exec Website.ChangePassword
2 | @PersonID = '<%= options[:PersonID] %>',
3 | @OldPassword = '<%= options[:OldPassword]%>',
4 | @NewPassword = '<%= options[:NewPassword] %>'
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/sql/WideWorldImporters/website/init_n_changePassword.sql.erb:
--------------------------------------------------------------------------------
1 | exec Website.ActivateWebsiteLogon
2 | @PersonID = '<%= options[:PersonID] %>',
3 | @LogonName = '<%= options[:LogonName] %>',
4 | @InitialPassword = '<%= options[:InitialPassword] %>'
5 |
6 | exec Website.ChangePassword
7 | @PersonID = '<%= options[:PersonID] %>',
8 | @OldPassword = '<%= options[:InitialPassword]%>',
9 | @NewPassword = '<%= options[:NewPassword] %>'
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/sql/WideWorldImporters/website/init_n_changeWrongPassword.sql.erb:
--------------------------------------------------------------------------------
1 | exec Website.ActivateWebsiteLogon
2 | @PersonID = '<%= options[:PersonID] %>',
3 | @LogonName = '<%= options[:LogonName] %>',
4 | @InitialPassword = '<%= options[:InitialPassword] %>'
5 |
6 | exec Website.ChangePassword
7 | @PersonID = '<%= options[:PersonID] %>',
8 | @OldPassword = '<%= options[:OldPassword]%>',
9 | @NewPassword = '<%= options[:NewPassword] %>'
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/sql/common/select_vars.sql.erb:
--------------------------------------------------------------------------------
1 | % declare_vars = options[:options][:declare_vars]
2 | % vars = options[:vars]
3 | % var_count = vars.count
4 | % sql_script = options[:sql_script]
5 | %
6 | <% if declare_vars %>
7 | <% vars.each do |var| %>
8 | declare @<%= var[0].to_s %> <%= var[1] %>;
9 | <% end %>
10 |
11 | <% end %>
12 | %
13 | <%= sql_script.split(/\r\n/).map{|i| i.strip}.join("\r\n") %>
14 | <% if var_count > 0 %>
15 |
16 |
17 | select
18 | <% vars.each_with_index do |var, index| %>
19 | <% var_name = var[0].to_s %>
20 | @<%= var_name %> as <%= var_name %><%= index < var_count - 1 ? ',' : ';' %>
21 | <% end %>
22 | <% end %>
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/sql/sample_1/create_my_table.sql.erb:
--------------------------------------------------------------------------------
1 | create table MyTable(x int, y int);
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/sql/sample_1/my_table_on_power.sql.erb:
--------------------------------------------------------------------------------
1 | select x, y, convert(int, Power(x, y)) as [power]
2 | from MyTable;
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/sql/sample_1/play_with_numbers.sql.erb:
--------------------------------------------------------------------------------
1 | declare @x int;
2 | declare @y int;
3 |
4 | set @x = <%= options[:x]%>;
5 | set @y = <%= options[:y]%>;
6 |
7 | -- Return just the product of @x and @y
8 | select @x * @y [product] union all
9 | select 12;
10 |
11 | -- Return the numbers and their sum
12 | select @x x, @y y, @x + @y [sum];
13 |
14 | -- Get the two numbers in one column and their sum with 32 in another
15 | select @x p, @x + 32 s union all
16 | select @y p, @y + 32 s;
17 |
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/sql/sample_1/sysobjects.sql.erb:
--------------------------------------------------------------------------------
1 | select * from sysobjects where xtype = 'S';
--------------------------------------------------------------------------------
/db_tests/WideWorldImporters/sql/sample_1/sysobjects_with_params.sql.erb:
--------------------------------------------------------------------------------
1 | <%# Every parameter passed to a SQL template appears in the options hash available to the template %>
2 | select * from sysobjects where xtype = '<%= options[:xtype] %>';
--------------------------------------------------------------------------------
/db_tests/demotest/data/sample_1/my_table_expected_power_results.csv:
--------------------------------------------------------------------------------
1 | "x","y","power"
2 | "2","1","2"
3 | "3","2","9"
4 | "4","3","64"
5 | "5","4","625"
6 | "4","2","16"
7 | "3","3","27"
8 | "2","4","16"
9 | "1","5","1"
10 | "-1","2","1"
11 | "-2","5","-32"
12 |
--------------------------------------------------------------------------------
/db_tests/demotest/data/sample_1/my_table_initial_data.csv:
--------------------------------------------------------------------------------
1 | "x","y"
2 | 2,1
3 | 3,2
4 | 4,3
5 | 5,4
6 | 4,2
7 | 3,3
8 | 2,4
9 | 1,5
10 | -1,2
11 | -2,5
12 |
--------------------------------------------------------------------------------
/db_tests/demotest/data/sample_1/numbers_expected_output.csv:
--------------------------------------------------------------------------------
1 | "p","s"
2 | 2,34
3 | 12,44
4 |
--------------------------------------------------------------------------------
/db_tests/demotest/database.yml:
--------------------------------------------------------------------------------
1 | # Database connection.
2 |
3 | # Slacker supports odbc and tiny_tds.
4 | # tiny_tds is recommended.
5 | # When not set, driver defaults to odbc for backward compatibility.
6 | driver: tiny_tds
7 |
8 | # Full instance name when using odbc; hostname or IP when using tiny_tds.
9 | server: my_server
10 |
11 | # Port is used by tiny_tds only. Defaults to 1433 when not set.
12 | # Use server and port when targeting named instances with tiny_tds.
13 | port: 1433
14 |
15 | database: my_database
16 |
17 | # Slacker supports only SQL Server authentication.
18 | user: user_name
19 | password: password
20 |
--------------------------------------------------------------------------------
/db_tests/demotest/debug/failed_examples/example_001.sql:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/db_tests/demotest/debug/failed_examples/example_001.sql
--------------------------------------------------------------------------------
/db_tests/demotest/debug/passed_examples/example_001.sql:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/db_tests/demotest/debug/passed_examples/example_001.sql
--------------------------------------------------------------------------------
/db_tests/demotest/lib/helpers/my_helper.rb:
--------------------------------------------------------------------------------
1 | module MyHelper
2 | end
--------------------------------------------------------------------------------
/db_tests/demotest/sql/sample_1/create_my_table.sql.erb:
--------------------------------------------------------------------------------
1 | create table MyTable(x int, y int);
--------------------------------------------------------------------------------
/db_tests/demotest/sql/sample_1/my_table_on_power.sql.erb:
--------------------------------------------------------------------------------
1 | select x, y, convert(int, Power(x, y)) as [power]
2 | from MyTable;
--------------------------------------------------------------------------------
/db_tests/demotest/sql/sample_1/play_with_numbers.sql.erb:
--------------------------------------------------------------------------------
1 | declare @x int;
2 | declare @y int;
3 |
4 | set @x = <%= options[:x]%>;
5 | set @y = <%= options[:y]%>;
6 |
7 | -- Return just the product of @x and @y
8 | select @x * @y [product] union all
9 | select 12;
10 |
11 | -- Return the numbers and their sum
12 | select @x x, @y y, @x + @y [sum];
13 |
14 | -- Get the two numbers in one column and their sum with 32 in another
15 | select @x p, @x + 32 s union all
16 | select @y p, @y + 32 s;
17 |
--------------------------------------------------------------------------------
/db_tests/demotest/sql/sample_1/sysobjects.sql.erb:
--------------------------------------------------------------------------------
1 | select * from sysobjects where xtype = 'S';
--------------------------------------------------------------------------------
/db_tests/demotest/sql/sample_1/sysobjects_with_params.sql.erb:
--------------------------------------------------------------------------------
1 | <%# Every parameter passed to a SQL template appears in the options hash available to the template %>
2 | select * from sysobjects where xtype = '<%= options[:xtype] %>';
--------------------------------------------------------------------------------
/db_tests/slacker_sample/data/sample_1/my_table_expected_power_results.csv:
--------------------------------------------------------------------------------
1 | "x","y","power"
2 | "2","1","2"
3 | "3","2","9"
4 | "4","3","64"
5 | "5","4","625"
6 | "4","2","16"
7 | "3","3","27"
8 | "2","4","16"
9 | "1","5","1"
10 | "-1","2","1"
11 | "-2","5","-32"
12 |
--------------------------------------------------------------------------------
/db_tests/slacker_sample/data/sample_1/my_table_initial_data.csv:
--------------------------------------------------------------------------------
1 | "x","y"
2 | 2,1
3 | 3,2
4 | 4,3
5 | 5,4
6 | 4,2
7 | 3,3
8 | 2,4
9 | 1,5
10 | -1,2
11 | -2,5
12 |
--------------------------------------------------------------------------------
/db_tests/slacker_sample/data/sample_1/numbers_expected_output.csv:
--------------------------------------------------------------------------------
1 | "p","s"
2 | 2,34
3 | 12,44
4 |
--------------------------------------------------------------------------------
/db_tests/slacker_sample/database.yml:
--------------------------------------------------------------------------------
1 | # Database connection.
2 |
3 | # Slacker supports odbc and tiny_tds.
4 | # tiny_tds is recommended.
5 | # When not set, driver defaults to odbc for backward compatibility.
6 | driver: tiny_tds
7 |
8 | # Full instance name when using odbc; hostname or IP when using tiny_tds.
9 | server: localhost
10 |
11 | # Port is used by tiny_tds only. Defaults to 1433 when not set.
12 | # Use server and port when targeting named instances with tiny_tds.
13 | port: 1433
14 |
15 | database: tempdb
16 |
17 | # Slacker supports only SQL Server authentication.
18 | user: sa
19 | password: SqlDevOps2017
20 |
21 | console_enabled: false
22 |
--------------------------------------------------------------------------------
/db_tests/slacker_sample/lib/helpers/my_helper.rb:
--------------------------------------------------------------------------------
1 | module MyHelper
2 | end
--------------------------------------------------------------------------------
/db_tests/slacker_sample/sql/sample_1/create_my_table.sql.erb:
--------------------------------------------------------------------------------
1 | create table MyTable(x int, y int);
--------------------------------------------------------------------------------
/db_tests/slacker_sample/sql/sample_1/my_table_on_power.sql.erb:
--------------------------------------------------------------------------------
1 | select x, y, convert(int, Power(x, y)) as [power]
2 | from MyTable;
--------------------------------------------------------------------------------
/db_tests/slacker_sample/sql/sample_1/play_with_numbers.sql.erb:
--------------------------------------------------------------------------------
1 | declare @x int;
2 | declare @y int;
3 |
4 | set @x = <%= options[:x]%>;
5 | set @y = <%= options[:y]%>;
6 |
7 | -- Return just the product of @x and @y
8 | select @x * @y [product] union all
9 | select 12;
10 |
11 | -- Return the numbers and their sum
12 | select @x x, @y y, @x + @y [sum];
13 |
14 | -- Get the two numbers in one column and their sum with 32 in another
15 | select @x p, @x + 32 s union all
16 | select @y p, @y + 32 s;
17 |
--------------------------------------------------------------------------------
/db_tests/slacker_sample/sql/sample_1/sysobjects.sql.erb:
--------------------------------------------------------------------------------
1 | select * from sysobjects where xtype = 'S';
--------------------------------------------------------------------------------
/db_tests/slacker_sample/sql/sample_1/sysobjects_with_params.sql.erb:
--------------------------------------------------------------------------------
1 | <%# Every parameter passed to a SQL template appears in the options hash available to the template %>
2 | select * from sysobjects where xtype = '<%= options[:xtype] %>';
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '2'
2 | services:
3 | webapp:
4 | image: sqlpass.azurecr.io/webapp:latest
5 | depends_on:
6 | - mssql
7 | container_name: webapp
8 | ports:
9 | - "80:3000"
10 | mssql:
11 | image: sqlpass.azurecr.io/mssql-dev-db-image:latest
12 | container_name: mssql
13 | ports:
14 | - "1433:1433"
15 | environment:
16 | SA_PASSWORD: "SqlDevOps2017"
17 | ACCEPT_EULA: "Y"
18 | MSSQL_PID: Developer
19 |
--------------------------------------------------------------------------------
/docker-login.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | docker login sqlpass.azurecr.io -u $1 -p $2
--------------------------------------------------------------------------------
/docker_cluster/_archieve/docker_dev.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | docker rm -f sqlpass
4 |
5 | docker run --name sqlpassdev -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=SqlDevOps2017' -p 1433:1433 -d microsoft/mssql-server-linux
6 |
7 | sleep 10
8 |
9 | # create database
10 | /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P SqlDevOps2017 -i createdb.sql
11 |
12 | # execute sql script to create database objects
13 | /opt/mssql-tools/bin/sqlcmd -S localhost -d AdventureWorks -U sa -P SqlDevOps2017 -i script.sql > .executionlog
14 |
15 | # commit sqlpassdev to dev-db-container
16 | docker commit sqlpassdev dev-db:latest
17 |
18 | #docker tag dev-db:latest sqldevopsacs.azurecr.io/sqldevops/dev-db:latest
19 |
20 | docker rm -f sqlpassdev
--------------------------------------------------------------------------------
/docker_cluster/_archieve/docker_pp.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | #create a new container - sqlpass and sqlpassdev
4 | docker run --name sqlpass -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=SqlDevOps2017' -p 1433:1433 -v /azurebackups:/azurebackups -d microsoft/mssql-server-linux
5 |
6 | sleep 10
7 |
8 | #restore db
9 | /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P SqlDevOps2017 -i restore.sql
10 |
11 | #mask sensitive user data
12 | /opt/mssql-tools/bin/sqlcmd -S localhost -d AdventureWorks -U sa -P SqlDevOps2017 -i ddm.sql
13 |
14 | #create script user without unmask permission
15 | /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P SqlDevOps2017 -i create_user.sql
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/docker_cluster/_archieve/mssql_image_build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | dt=`date '+%Y-%m-%d_%H-%M-%S'`
4 | echo $dt
5 |
6 | docker commit mssql_unittest wwi_test:temp
7 | docker build ~/tests/init_db/Dockerfile --rm -t sqldevopsacs.azurecr.io/ww_test:$dt
8 | docker tag sqldevopsacs.azurecr.io/ww_test:latest
9 |
10 | dockr login sqldevopsacs.azurecr.io
11 |
12 | docker push sqldevopsacs.azurecr.io/ww_test:$dt
13 | docker push sqldevopsacs.azurecr.io/ww_test:latest
14 |
--------------------------------------------------------------------------------
/docker_cluster/_archieve/runner_build.sh:
--------------------------------------------------------------------------------
1 | dt=`date '+%Y-%m-%d_%H-%M-%S'`
2 | echo $dt
3 |
4 | docker build . --rm -t ericskang/slacker-node-runner:$dt
5 |
6 | docker tag ericskang/slacker-node-runner:$dt ericskang/slacker-node-runner:latest
7 | docker tag ericskang/slacker-node-runner:$dt sqldevopsacs.azurecr.io/slacker-node-runner:$dt
8 | docker tag ericskang/slacker-node-runner:latest sqldevopsacs.azurecr.io/slacker-node-runner:latest
9 |
10 | echo sqldevopsacs.azurecr.io/slacker-node-runner:$dt
11 |
12 | #docker login
13 |
14 | #docker push ericskang/slacker-node-runner:$dt
15 | #docker push ericskang/slacker-node-runner:latest
16 |
17 | #docker rm -f slacker-runner
18 | docker rmi -f slacker-node-runner:temp
19 |
20 | docker rmi -f $(docker images -f "dangling=true" -q)
--------------------------------------------------------------------------------
/docker_cluster/_archieve/startup_all_dev.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | docker-compose build
4 | docker-compose up -d
5 |
6 | docker rmi -f $(docker images -f "dangling=true" -q)
7 |
8 | docker exec -ti mssql_unittest bash ./restore_wwi.sh
9 |
10 | cd unittest_db
11 | bash ./restore.sh
12 |
13 | cd ../tests/init_db
14 | powershell ./init_unittest_db.ps1
15 |
16 | curl http://localhost:8888/api/runall
17 |
18 |
--------------------------------------------------------------------------------
/docker_cluster/aks/1-basics.sh:
--------------------------------------------------------------------------------
1 | docker pull microsoft/mssql-server-linux:latest
2 |
3 | docker run --name demosqlserver \
4 | -p 1431:1433 \
5 | -e "ACCEPT_EULA=Y" \
6 | -e "SA_PASSWORD=SqlDevOps2017" \
7 | -e "MSSQL_PID=Developer" \
8 | -d microsoft/mssql-server-linux:latest
9 |
10 | docker ps
11 |
12 | docker rm -f demosqlserver
13 |
14 | docker-compose up -d
15 |
16 |
--------------------------------------------------------------------------------
/docker_cluster/aks/2-build your own.sh:
--------------------------------------------------------------------------------
1 | docker build . -t ericskang/demoimage:latest
2 |
3 | docker login
4 |
5 | docker push ericskang/demoimage:latest
--------------------------------------------------------------------------------
/docker_cluster/aks/4-deploy to aks.sh:
--------------------------------------------------------------------------------
1 | clear
2 | kubectl apply -f namespace.yml
3 |
4 | clear
5 | kubectl apply -f pvc.yml
6 | kubectl get pvc -n production
7 |
8 | clear
9 | kubectl get sc
10 |
11 | clear
12 | kubectl apply -f sql-statefulset.yml
13 | kubectl apply -f webapp.yml
14 | kubectl get services -n production
15 | kubectl get pods -n production
--------------------------------------------------------------------------------
/docker_cluster/aks/5-resotre database.sh:
--------------------------------------------------------------------------------
1 | kubectl exec -ti mssql-0 -n production bash
2 |
3 | #run following commands in the kubernetes container terminal
4 | cd /var/opt/mssql
5 | mkdir -p backup
6 | cd backup
7 | wget https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v0.2/WideWorldImporters-Full.bak
8 | wget https://raw.githubusercontent.com/erickangMSFT/sqldevops/master/docker_cluster/aks/restore.sql
9 | /opt/mssql-tools/bin/sqlcmd -Usa -PSqlDevOps2017 -i restore.sql
10 |
11 |
--------------------------------------------------------------------------------
/docker_cluster/aks/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM microsoft/mssql-tools:latest
2 |
3 | WORKDIR /temp/scripts
4 | COPY restore.sql .
5 |
6 | CMD /bin/bash
--------------------------------------------------------------------------------
/docker_cluster/aks/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '2'
2 | services:
3 | mssql:
4 | image: ericskang/unittestdb:latest
5 | container_name: mssql
6 | ports:
7 | - "1433:1433"
8 | environment:
9 | SA_PASSWORD: "SqlDevOps2017"
10 | ACCEPT_EULA: "Y"
11 | MSSQL_PID: Developer
12 | webapp:
13 | image: ericskang/webapp:latest
14 | depends_on:
15 | - mssql
16 | container_name: webapp
17 | ports:
18 | - "80:3000"
19 |
20 |
--------------------------------------------------------------------------------
/docker_cluster/aks/kube-secret.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | kubectl create secret docker-registry mykey --docker-server=index.docker.io --docker-username= --docker-password= --docker-email= -n production
--------------------------------------------------------------------------------
/docker_cluster/aks/mssql-cli.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: apps/v1beta1
3 | kind: Deployment
4 | metadata:
5 | name: mssql-cli
6 | namespace: production
7 | spec:
8 | replicas: 1
9 | template:
10 | metadata:
11 | labels:
12 | app: cli
13 | spec:
14 | containers:
15 | - name: mssql-cli
16 | image: ericskang/tools:mssql-cli
17 | command: [bash, -c, "tail -f /dev/null"]
18 | imagePullSecrets:
19 | - name: mykey
20 |
--------------------------------------------------------------------------------
/docker_cluster/aks/namespace.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: Namespace
4 | metadata:
5 | name: production
6 |
7 | ---
8 | apiVersion: v1
9 | kind: Namespace
10 | metadata:
11 | name: sqldevops
--------------------------------------------------------------------------------
/docker_cluster/aks/pvc.yml:
--------------------------------------------------------------------------------
1 | ---
2 | kind: PersistentVolumeClaim
3 | apiVersion: v1
4 | metadata:
5 | name: sqlpvclaim1
6 | namespace: production
7 | spec:
8 | storageClassName: default
9 | accessModes:
10 | - ReadWriteOnce
11 | resources:
12 | requests:
13 | storage: 10Gi
14 |
--------------------------------------------------------------------------------
/docker_cluster/aks/restore.sql:
--------------------------------------------------------------------------------
1 | RESTORE DATABASE WideWorldImporters FROM DISK = "/var/opt/mssql/backup/WideWorldImporters-Full.bak"
2 | WITH MOVE "WWI_Primary" TO "/var/opt/mssql/data/WideWorldImporters.mdf",
3 | MOVE "WWI_Userdata" TO "/var/opt/mssql/data/WideWorldImporters_Userdata.mdf",
4 | MOVE "WWI_Log" TO "/var/opt/mssql/data/WideWorldImporters.ldf", MOVE "WWI_InMemory_Data_1"
5 | TO "/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1"
--------------------------------------------------------------------------------
/docker_cluster/aks/webapp.yml:
--------------------------------------------------------------------------------
1 | ---
2 | kind: Service
3 | apiVersion: v1
4 | metadata:
5 | name: webapp
6 | namespace: production
7 | spec:
8 | selector:
9 | app: webapp
10 | ports:
11 | - protocol: TCP
12 | port: 80
13 | targetPort: 3000
14 | type: LoadBalancer
15 |
16 | ---
17 | apiVersion: apps/v1beta1
18 | kind: Deployment
19 | metadata:
20 | name: webapp
21 | namespace: production
22 | spec:
23 | replicas: 1
24 | template:
25 | metadata:
26 | labels:
27 | app: webapp
28 | spec:
29 | containers:
30 | - name: webapp
31 | image: ericskang/webapp:latest
32 | ports:
33 | - containerPort: 3000
34 |
--------------------------------------------------------------------------------
/docker_cluster/demodb/mssql/docker_build_push.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | dt=`date '+%Y-%m-%d_%H-%M-%S'`
4 |
5 | # initial build including wwi backup files and restore script
6 | docker build . --rm -t ericskang/demodb:mssql
7 |
8 | docker push ericskang/demodb:mssql
9 |
10 | docker rmi -f $(docker images -f "dangling=true" -q)
11 |
--------------------------------------------------------------------------------
/docker_cluster/demodb/pgsql/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM postgres:alpine
2 |
3 | ENV POSTGRES_USER=sa
4 | ENV POSTGRES_PASSWORD SqlDevOps2017
5 |
6 | RUN apk add --update unzip ca-certificates openssl && update-ca-certificates && rm -rf /var/cache/apk/*
7 |
8 | WORKDIR /backup
9 | RUN wget -q https://ftp.postgresql.org/pub/projects/pgFoundry/dbsamples/pagila/pagila/pagila-0.10.1.zip
10 | RUN wget -q https://raw.githubusercontent.com/erickangMSFT/sqldevops/master/docker_cluster/pgsql_jobs/provisioning/provisioning.sh
11 | RUN chmod +x provisioning.sh
12 | RUN unzip ./pagila-0.10.1.zip
13 | RUN rm ./pagila-0.10.1.zip
14 |
15 | EXPOSE 5432
16 |
17 | CMD ["postgres"]
18 |
--------------------------------------------------------------------------------
/docker_cluster/demodb/pgsql/docker_build_push.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | dt=`date '+%Y-%m-%d_%H-%M-%S'`
4 |
5 | # initial build including wwi backup files and restore script
6 | docker build . --rm -t ericskang/demodb:pgsql
7 |
8 | docker push ericskang/demodb:pgsql
9 |
10 | docker rmi -f $(docker images -f "dangling=true" -q)
11 |
12 |
--------------------------------------------------------------------------------
/docker_cluster/docker network/docker_build/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM mssql:20170806-2
2 | CMD /opt/mssql/bin/sqlservr
--------------------------------------------------------------------------------
/docker_cluster/docker network/net.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # create a subnet network for containers to communicate (e.g. between node web app and mssql database)
4 | # e.g. docker network create -d bridge --subnet 10.234.0.0/16 mynetwork
5 |
6 | # or simply run the following commands
7 | docker network create mynet
8 | docker network list
9 |
10 | # add containers to the subnet network
11 |
12 | docker network connect mynet mssql
13 | docker network connect mynet wwiapp
14 |
15 | # check if restarting container is required step to make the network config effective.
16 | docker restart mssql
17 | docker restart wwiapp
18 |
19 | docker network inspect mynet
20 |
21 |
--------------------------------------------------------------------------------
/docker_cluster/docker-compose/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '2'
2 | services:
3 | webapp:
4 | image: ericskang/webapp:latest
5 | depends_on:
6 | - mssql
7 | container_name: webapp
8 | ports:
9 | - "80:3000"
10 | slacker:
11 | image: ericskang/slacker-node-runner:latest
12 | depends_on:
13 | - mssql
14 | container_name: slacker
15 | ports:
16 | - "8000:8000"
17 | sqltools:
18 | image: ericskang/sqltools:latest
19 | container_name: sqltools
20 | mssql:
21 | image: ericskang/unittestdb:latest
22 | container_name: mssql
23 | ports:
24 | - "1433:1433"
25 | environment:
26 | SA_PASSWORD: "SqlDevOps2017"
27 | ACCEPT_EULA: "Y"
28 | MSSQL_PID: Developer
29 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/common_samples/iptable:
--------------------------------------------------------------------------------
1 | sudo iptables -t nat -A PREROUTING -p tcp --dport 6443 -j DNAT --to-destination 10.177.201.197:6443
2 | sudo iptables -t nat -A POSTROUTING -p tcp -d 10.177.201.197 --dport 6443 -j SNAT --to-source 10.128.19.19
3 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/common_samples/kubectl_commands.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # get cluster / service / deployment and pod info
4 | clear
5 | kubectl cluster-info
6 | kubectl get services -n sqldevops-dev
7 | kubectl get deployments -n sqldevops-dev
8 | kubectl get pods -n sqldevops-dev
9 |
10 | # spining up / down
11 | clear
12 | kubectl scale deployment mssql --replicas=10 -n sqldevops
13 | watch kubectl get pods -n sqldevops-dev
14 |
15 | clear
16 | kubectl scale deployment mssql --replicas=1 -n sqldevops
17 | watch kubectl get pods -n sqldevops-dev
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/common_samples/kubectl_exec:
--------------------------------------------------------------------------------
1 | kubectl exec mssql-1960134983-3tmk8 -c mssql -n sqldevops -i -t -- bash -il
2 | kubectl exec slacker -c slacker -n sqldevops -i -t -- bash -il
3 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/common_samples/management/persistent_volumes.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # https://kubernetes.io/docs/concepts/storage/persistent-volumes/
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/common_samples/monitoring.sh:
--------------------------------------------------------------------------------
1 | kubectl apply --namespace kube-system -f "https://cloud.weave.works/k8s/scope.yaml?k8s-version=$(kubectl version | base64 | tr -d '\n')"
2 |
3 | kubectl port-forward -n kube-system "$(kubectl get -n kube-system pod --selector=weave-scope-component=app -o jsonpath='{.items..metadata.name}')" 4040
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/dev_env/jobs/database_migration_job.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v1
3 | kind: Job
4 | metadata:
5 | name: db-migration-job
6 | namespace: sqldevops
7 | spec:
8 | template:
9 | metadata:
10 | name: db-migration-job
11 | spec:
12 | containers:
13 | - name: db-migration-job
14 | image: ericskang/db-jobs:migration
15 | command: ["/bin/bash", "-c", "./migration_runner.py"]
16 | restartPolicy: Never
17 |
18 |
19 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/dev_env/jobs/database_test_job.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v1
3 | kind: Job
4 | metadata:
5 | name: db-test-job
6 | namespace: sqldevops
7 | spec:
8 | template:
9 | metadata:
10 | name: db-test-job
11 | spec:
12 | containers:
13 | - name: db-test-job
14 | image: ericskang/mssql-slacker:controller
15 | imagePullPolicy: Always
16 | command: ["/bin/sh", "-c", "/usr/local/bin/python ./run_tests.py -s slacker"]
17 | restartPolicy: Never
18 |
19 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/dev_env/namespace.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Namespace
3 | metadata:
4 | name: sqldevops
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/multipods/mssql/jobs/business-continuity/sql-scheduled-backup.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v2alpha1
3 | kind: CronJob
4 | metadata:
5 | name: sql-full-backup-job
6 | namespace: production
7 | spec:
8 | schedule: "*/59 */23 * * *"
9 | jobTemplate:
10 | spec:
11 | template:
12 | spec:
13 | containers:
14 | - name: sql-full-backup-job
15 | image: ericskang/cronjobs:backup
16 | args:
17 | - /bin/bash
18 | - -c
19 | - ./full-backup.sh
20 | restartPolicy: OnFailure
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/multipods/mssql/jobs/business-continuity/sql-scheduled-logbackup.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v2alpha1
3 | kind: CronJob
4 | metadata:
5 | name: sql-log-backup-job
6 | namespace: sqldevops
7 | spec:
8 | schedule: "*/1 * * * *"
9 | jobTemplate:
10 | spec:
11 | template:
12 | spec:
13 | containers:
14 | - name: sql-log-backup-job
15 | image: ericskang/cronjobs:backup
16 | args:
17 | - /bin/bash
18 | - -c
19 | - ./log-backup.sh
20 | restartPolicy: OnFailure
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/multipods/mssql/jobs/migration/sql-db-migration.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v1
3 | kind: Job
4 | metadata:
5 | name: db-migration-job
6 | namespace: production
7 | spec:
8 | template:
9 | metadata:
10 | name: db-migration-job
11 | spec:
12 | containers:
13 | - name: db-migration-job
14 | image: ericskang/db-jobs:migration
15 | imagePullPolicy: Always
16 | command: ["/bin/bash", "-c", "./migration_runner.py"]
17 | restartPolicy: Never
18 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/multipods/mssql/jobs/provisioning/sql-provisioning.yml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1
2 | kind: Job
3 | metadata:
4 | name: sql-provisioning
5 | namespace: production
6 | spec:
7 | template:
8 | metadata:
9 | name: sql-provisioning
10 | spec:
11 | containers:
12 | - name: sql-provisioning
13 | image: ericskang/db-provisioning-job:mssql
14 | command: ["/bin/bash", "-c", "./provision.sh"]
15 | restartPolicy: Never
16 |
17 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/multipods/mssql/persistent_volume/pv-host.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: PersistentVolume
4 | metadata:
5 | name: sqlpv
6 | namespace: production
7 | spec:
8 | accessModes:
9 | - ReadWriteOnce
10 | capacity:
11 | storage: 10Gi
12 | hostPath:
13 | path: /tmp
14 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/multipods/mssql/persistent_volume/pv-nfs.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: PersistentVolume
4 | metadata:
5 | name: sqlpv
6 | namespace: production
7 | spec:
8 | accessModes:
9 | - ReadWriteOnce
10 | capacity:
11 | storage: 10Gi
12 | persistentVolumeReclaimPolicy: Retain
13 | storageClassName: slow
14 | nfs:
15 | path: /var/nfsshare
16 | server: 10.128.19.19
17 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/multipods/mssql/web.yml:
--------------------------------------------------------------------------------
1 | ---
2 | kind: Service
3 | apiVersion: v1
4 | metadata:
5 | name: webapp
6 | namespace: production
7 | spec:
8 | selector:
9 | app: webapp
10 | tier: frontend
11 | ports:
12 | - protocol: TCP
13 | port: 80
14 | targetPort: 3000
15 | nodePort: 30080
16 | type: NodePort
17 |
18 | ---
19 | apiVersion: apps/v1beta1
20 | kind: Deployment
21 | metadata:
22 | name: webapp
23 | namespace: production
24 | spec:
25 | replicas: 1
26 | template:
27 | metadata:
28 | labels:
29 | app: webapp
30 | tier: frontend
31 | spec:
32 | containers:
33 | - name: webapp
34 | image: ericskang/webapp:latest
35 | imagePullPolicy: Always
36 | ports:
37 | - containerPort: 3000
38 |
39 |
40 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/multipods/namespace.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: Namespace
4 | metadata:
5 | name: production
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/nfs-provisioner/auth/clusterrole.yaml:
--------------------------------------------------------------------------------
1 | kind: ClusterRole
2 | apiVersion: rbac.authorization.k8s.io/v1
3 | metadata:
4 | name: nfs-client-provisioner-runner
5 | rules:
6 | - apiGroups: [""]
7 | resources: ["persistentvolumes"]
8 | verbs: ["get", "list", "watch", "create", "delete"]
9 | - apiGroups: [""]
10 | resources: ["persistentvolumeclaims"]
11 | verbs: ["get", "list", "watch", "update"]
12 | - apiGroups: ["storage.k8s.io"]
13 | resources: ["storageclasses"]
14 | verbs: ["get", "list", "watch"]
15 | - apiGroups: [""]
16 | resources: ["events"]
17 | verbs: ["list", "watch", "create", "update", "patch"]
18 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/nfs-provisioner/auth/clusterrolebinding.yaml:
--------------------------------------------------------------------------------
1 | kind: ClusterRoleBinding
2 | apiVersion: rbac.authorization.k8s.io/v1
3 | metadata:
4 | name: run-nfs-client-provisioner
5 | subjects:
6 | - kind: ServiceAccount
7 | name: nfs-client-provisioner
8 | namespace: default
9 | roleRef:
10 | kind: ClusterRole
11 | name: nfs-client-provisioner-runner
12 | apiGroup: rbac.authorization.k8s.io
13 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/nfs-provisioner/auth/serviceaccount.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: ServiceAccount
3 | metadata:
4 | name: nfs-client-provisioner
5 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/nfs-provisioner/class.yml:
--------------------------------------------------------------------------------
1 | apiVersion: storage.k8s.io/v1beta1
2 | kind: StorageClass
3 | metadata:
4 | name: managed-premium
5 | provisioner: fuseim.pri/ifs
6 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/nfs-provisioner/install.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | kubectl apply -f ./deployment.yaml
4 | kubectl apply -f ./class.yaml
5 | kubectl apply -f ./auth/serviceaccount.yaml
6 | kubectl apply -f ./auth/clusterrole.yaml
7 | kubectl apply -f ./auth/clusterrolebinding.yaml
8 |
9 | kubectl patch deployment nfs-client-provisioner -p '{"spec":{"template":{"spec":{"serviceAccount":"nfs-client-provisioner"}}}}'
10 |
11 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/nfs-provisioner/pvc.yml:
--------------------------------------------------------------------------------
1 | kind: PersistentVolumeClaim
2 | apiVersion: v1
3 | metadata:
4 | name: sqlpvclaim
5 | annotations:
6 | volume.beta.kubernetes.io/storage-class: "default"
7 | spec:
8 | accessModes:
9 | - ReadWriteOnce
10 | resources:
11 | requests:
12 | storage: 1Mi
13 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/nfs-provisioner/test.yml:
--------------------------------------------------------------------------------
1 | kind: Pod
2 | apiVersion: v1
3 | metadata:
4 | name: test-pod
5 | namespace: production
6 | spec:
7 | containers:
8 | - name: test-pod
9 | image: gcr.io/google_containers/busybox:1.24
10 | command:
11 | - "/bin/sh"
12 | args:
13 | - "-c"
14 | - "touch /mnt/SUCCESS && exit 0 || exit 1"
15 | volumeMounts:
16 | - name: nfs-pvc
17 | mountPath: "/mnt"
18 | restartPolicy: "Never"
19 | volumes:
20 | - name: nfs-pvc
21 | persistentVolumeClaim:
22 | claimName: sqlpvclaim
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/prod_db/mssql/jobs/business-continuity/sql-scheduled-backup.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v2alpha1
3 | kind: CronJob
4 | metadata:
5 | name: sql-full-backup-job
6 | namespace: production
7 | spec:
8 | schedule: "*/59 */23 * * *"
9 | jobTemplate:
10 | spec:
11 | template:
12 | spec:
13 | containers:
14 | - name: sql-full-backup-job
15 | image: ericskang/cronjobs:backup
16 | args:
17 | - /bin/bash
18 | - -c
19 | - ./full-backup.sh
20 | restartPolicy: OnFailure
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/prod_db/mssql/jobs/business-continuity/sql-scheduled-logbackup.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v2alpha1
3 | kind: CronJob
4 | metadata:
5 | name: sql-log-backup-job
6 | namespace: sqldevops
7 | spec:
8 | schedule: "*/1 * * * *"
9 | jobTemplate:
10 | spec:
11 | template:
12 | spec:
13 | containers:
14 | - name: sql-log-backup-job
15 | image: ericskang/cronjobs:backup
16 | args:
17 | - /bin/bash
18 | - -c
19 | - ./log-backup.sh
20 | restartPolicy: OnFailure
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/prod_db/mssql/jobs/migration/sql-db-migration.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v1
3 | kind: Job
4 | metadata:
5 | name: db-migration-job
6 | namespace: production
7 | spec:
8 | template:
9 | metadata:
10 | name: db-migration-job
11 | spec:
12 | containers:
13 | - name: db-migration-job
14 | image: ericskang/db-jobs:migration
15 | imagePullPolicy: Always
16 | command: ["/bin/bash", "-c", "./migration_runner.py"]
17 | restartPolicy: Never
18 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/prod_db/mssql/jobs/provisioning/sql-provisioning.yml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1
2 | kind: Job
3 | metadata:
4 | name: sql-provisioning
5 | namespace: production
6 | spec:
7 | template:
8 | metadata:
9 | name: sql-provisioning
10 | spec:
11 | containers:
12 | - name: sql-provisioning
13 | image: ericskang/db-provisioning-job:mssql
14 | command: ["/bin/bash", "-c", "./provision.sh"]
15 | restartPolicy: Never
16 |
17 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/prod_db/mssql/persistent_volume/hostpath/pv-host.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: PersistentVolume
4 | metadata:
5 | name: sqlpv
6 | namespace: production
7 | spec:
8 | accessModes:
9 | - ReadWriteOnce
10 | capacity:
11 | storage: 10Gi
12 | hostPath:
13 | path: /tmp
14 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/prod_db/mssql/persistent_volume/pv-nfs.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: PersistentVolume
4 | metadata:
5 | name: sqlnfs
6 | namespace: production
7 | spec:
8 | accessModes:
9 | - ReadWriteOnce
10 | capacity:
11 | storage: 20Gi
12 | persistentVolumeReclaimPolicy: Recycle
13 | nfs:
14 | path: "/k8svolumes/sqlpv1"
15 | server: "10.135.10.138"
16 |
17 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/prod_db/mssql/persistent_volume/pvc-nfs.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: PersistentVolumeClaim
4 | metadata:
5 | name: sqlpvclaim
6 | namespace: production
7 | spec:
8 | accessModes:
9 | - ReadWriteOnce
10 | storageClassName: "managed-nfs-storage"
11 | resources:
12 | requests:
13 | storage: 10Gi
14 |
15 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/prod_db/mssql/persistent_volume/rw/pv-nfs.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: PersistentVolume
4 | metadata:
5 | name: sqlnfs1
6 | namespace: production
7 | spec:
8 | accessModes:
9 | - ReadWriteOnce
10 | capacity:
11 | storage: 20Gi
12 | persistentVolumeReclaimPolicy: Recycle
13 | nfs:
14 | path: "/export/pvc-sql1"
15 | server: "192.168.1.119"
16 |
17 | ---
18 | apiVersion: v1
19 | kind: PersistentVolume
20 | metadata:
21 | name: sqlnfs2
22 | namespace: production
23 | spec:
24 | accessModes:
25 | - ReadWriteOnce
26 | capacity:
27 | storage: 20Gi
28 | persistentVolumeReclaimPolicy: Recycle
29 | nfs:
30 | path: "/export/pvc-sql2"
31 | server: "192.168.1.119"
32 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/prod_db/mssql/persistent_volume/rw/pvc-nfs.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: PersistentVolumeClaim
4 | metadata:
5 | name: sqlpvclaim1
6 | namespace: production
7 | spec:
8 | accessModes:
9 | - ReadWriteOnce
10 | storageClassName: ""
11 | resources:
12 | requests:
13 | storage: 10Gi
14 |
15 | ---
16 | apiVersion: v1
17 | kind: PersistentVolumeClaim
18 | metadata:
19 | name: sqlpvclaim2
20 | namespace: production
21 | spec:
22 | accessModes:
23 | - ReadWriteOnce
24 | storageClassName: ""
25 | resources:
26 | requests:
27 | storage: 10Gi
28 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/prod_db/mssql/web.yml:
--------------------------------------------------------------------------------
1 | ---
2 | kind: Service
3 | apiVersion: v1
4 | metadata:
5 | name: webapp
6 | namespace: production
7 | spec:
8 | selector:
9 | app: webapp
10 | tier: frontend
11 | ports:
12 | - protocol: TCP
13 | port: 80
14 | targetPort: 3000
15 | nodePort: 30080
16 | type: NodePort
17 |
18 | ---
19 | apiVersion: apps/v1beta1
20 | kind: Deployment
21 | metadata:
22 | name: webapp
23 | namespace: production
24 | spec:
25 | replicas: 1
26 | template:
27 | metadata:
28 | labels:
29 | app: webapp
30 | tier: frontend
31 | spec:
32 | containers:
33 | - name: webapp
34 | image: ericskang/webapp:latest
35 | imagePullPolicy: Always
36 | ports:
37 | - containerPort: 3000
38 |
39 |
40 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/prod_db/namespace.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: Namespace
4 | metadata:
5 | name: production
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/prod_db/pgsql/jobs/pg-provisioning.yml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1
2 | kind: Job
3 | metadata:
4 | name: pg-provisioning
5 | namespace: production
6 | spec:
7 | template:
8 | metadata:
9 | name: pg-provisioning
10 | spec:
11 | containers:
12 | - name: pg-provisioning
13 | image: ericskang/db-provisioning-job:pgsql
14 | command: ["/bin/bash", "-c", "./provisioning.sh"]
15 | restartPolicy: Never
16 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/prod_db/pgsql/persistent_volume/pv-host.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: PersistentVolume
4 | metadata:
5 | name: pgsqlpv
6 | namespace: production
7 | spec:
8 | accessModes:
9 | - ReadWriteOnce
10 | capacity:
11 | storage: 5Gi
12 | hostPath:
13 | path: /data/pgsqlvol1/
14 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/prod_db/pgsql/persistent_volume/pv-nfs.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: PersistentVolume
4 | metadata:
5 | name: pgsqlpv
6 | namespace: production
7 | spec:
8 | accessModes:
9 | - ReadWriteOnce
10 | capacity:
11 | storage: 10Gi
12 | persistentVolumeReclaimPolicy: Retain
13 | storageClassName: slow
14 | nfs:
15 | path: /var/nfsshare
16 | server: 10.128.19.19
17 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/nfs-prod/jobs/business-continuity/sql-scheduled-backup.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v2alpha1
3 | kind: CronJob
4 | metadata:
5 | name: sql-full-backup-job
6 | namespace: production
7 | spec:
8 | schedule: "*/59 */23 * * *"
9 | jobTemplate:
10 | spec:
11 | template:
12 | spec:
13 | containers:
14 | - name: sql-full-backup-job
15 | image: ericskang/cronjobs:backup
16 | args:
17 | - /bin/bash
18 | - -c
19 | - ./full-backup.sh
20 | restartPolicy: OnFailure
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/nfs-prod/jobs/business-continuity/sql-scheduled-logbackup.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v2alpha1
3 | kind: CronJob
4 | metadata:
5 | name: sql-log-backup-job
6 | namespace: production
7 | spec:
8 | schedule: "*/1 * * * *"
9 | jobTemplate:
10 | spec:
11 | template:
12 | spec:
13 | containers:
14 | - name: sql-log-backup-job
15 | image: ericskang/cronjobs:backup
16 | args:
17 | - /bin/bash
18 | - -c
19 | - ./log-backup.sh
20 | restartPolicy: OnFailure
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/nfs-prod/jobs/migration/sql-db-migration.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v1
3 | kind: Job
4 | metadata:
5 | name: db-migration-job
6 | namespace: production
7 | spec:
8 | template:
9 | metadata:
10 | name: db-migration-job
11 | spec:
12 | containers:
13 | - name: db-migration-job
14 | image: ericskang/db-jobs:migration
15 | imagePullPolicy: Always
16 | command: ["/bin/bash", "-c", "./migration_runner.py"]
17 | restartPolicy: Never
18 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/nfs-prod/jobs/provisioning/sql-provisioning.yml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1
2 | kind: Job
3 | metadata:
4 | name: sql-provisioning
5 | namespace: production
6 | spec:
7 | template:
8 | metadata:
9 | name: sql-provisioning
10 | spec:
11 | containers:
12 | - name: sql-provisioning
13 | image: ericskang/db-provisioning-job:mssql
14 | command: ["/bin/bash", "-c", "./provision.sh"]
15 | restartPolicy: Never
16 |
17 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/nfs-prod/web.yml:
--------------------------------------------------------------------------------
1 | ---
2 | kind: Service
3 | apiVersion: v1
4 | metadata:
5 | name: webapp
6 | namespace: production
7 | spec:
8 | selector:
9 | app: webapp
10 | tier: frontend
11 | ports:
12 | - protocol: TCP
13 | port: 80
14 | targetPort: 3000
15 | nodePort: 30080
16 | type: NodePort
17 |
18 | ---
19 | apiVersion: apps/v1beta1
20 | kind: Deployment
21 | metadata:
22 | name: webapp
23 | namespace: production
24 | spec:
25 | replicas: 1
26 | template:
27 | metadata:
28 | labels:
29 | app: webapp
30 | tier: frontend
31 | spec:
32 | containers:
33 | - name: webapp
34 | image: ericskang/webapp:latest
35 | imagePullPolicy: Always
36 | ports:
37 | - containerPort: 3000
38 |
39 |
40 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/prod/jobs/business-continuity/sql-scheduled-backup.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v2alpha1
3 | kind: CronJob
4 | metadata:
5 | name: sql-full-backup-job
6 | namespace: production
7 | spec:
8 | schedule: "*/59 */23 * * *"
9 | jobTemplate:
10 | spec:
11 | template:
12 | spec:
13 | containers:
14 | - name: sql-full-backup-job
15 | image: ericskang/cronjobs:backup
16 | args:
17 | - /bin/bash
18 | - -c
19 | - ./full-backup.sh
20 | restartPolicy: OnFailure
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/prod/jobs/business-continuity/sql-scheduled-logbackup.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v2alpha1
3 | kind: CronJob
4 | metadata:
5 | name: sql-log-backup-job
6 | namespace: production
7 | spec:
8 | schedule: "*/1 * * * *"
9 | jobTemplate:
10 | spec:
11 | template:
12 | spec:
13 | containers:
14 | - name: sql-log-backup-job
15 | image: ericskang/cronjobs:backup
16 | args:
17 | - /bin/bash
18 | - -c
19 | - ./log-backup.sh
20 | restartPolicy: OnFailure
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/prod/jobs/migration/sql-db-migration.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v1
3 | kind: Job
4 | metadata:
5 | name: db-migration-job
6 | namespace: production
7 | spec:
8 | template:
9 | metadata:
10 | name: db-migration-job
11 | spec:
12 | containers:
13 | - name: db-migration-job
14 | image: ericskang/db-jobs:migration
15 | imagePullPolicy: Always
16 | command: ["/bin/bash", "-c", "./migration_runner.py"]
17 | restartPolicy: Never
18 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/prod/jobs/provisioning/sql-provisioning.yml:
--------------------------------------------------------------------------------
1 | apiVersion: batch/v1
2 | kind: Job
3 | metadata:
4 | name: sql-provisioning
5 | namespace: production
6 | spec:
7 | template:
8 | metadata:
9 | name: sql-provisioning
10 | spec:
11 | containers:
12 | - name: sql-provisioning
13 | image: ericskang/db-provisioning-job:mssql
14 | command: ["/bin/bash", "-c", "./provision.sh"]
15 | restartPolicy: Never
16 |
17 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/prod/persistent_volume/pv-host.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: PersistentVolume
4 | metadata:
5 | name: sqlpv
6 | namespace: production
7 | spec:
8 | accessModes:
9 | - ReadWriteOnce
10 | capacity:
11 | storage: 10Gi
12 | hostPath:
13 | path: /tmp
14 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/prod/persistent_volume/pv-nfs.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: v1
3 | kind: PersistentVolume
4 | metadata:
5 | name: sqlpv
6 | namespace: production
7 | spec:
8 | accessModes:
9 | - ReadWriteOnce
10 | capacity:
11 | storage: 10Gi
12 | persistentVolumeReclaimPolicy: Retain
13 | storageClassName: slow
14 | nfs:
15 | path: /var/nfsshare
16 | server: 10.128.19.19
17 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/prod/web.yml:
--------------------------------------------------------------------------------
1 | ---
2 | kind: Service
3 | apiVersion: v1
4 | metadata:
5 | name: webapp
6 | namespace: production
7 | spec:
8 | selector:
9 | app: webapp
10 | tier: frontend
11 | ports:
12 | - protocol: TCP
13 | port: 80
14 | targetPort: 3000
15 | nodePort: 30080
16 | type: NodePort
17 |
18 | ---
19 | apiVersion: apps/v1beta1
20 | kind: Deployment
21 | metadata:
22 | name: webapp
23 | namespace: production
24 | spec:
25 | replicas: 1
26 | template:
27 | metadata:
28 | labels:
29 | app: webapp
30 | tier: frontend
31 | spec:
32 | containers:
33 | - name: webapp
34 | image: ericskang/webapp:latest
35 | imagePullPolicy: Always
36 | ports:
37 | - containerPort: 3000
38 |
39 |
40 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/testenv/jobs/database_migration_job.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v1
3 | kind: Job
4 | metadata:
5 | name: db-migration-job
6 | namespace: sqldevops
7 | spec:
8 | template:
9 | metadata:
10 | name: db-migration-job
11 | spec:
12 | containers:
13 | - name: db-migration-job
14 | image: ericskang/db-jobs:migration
15 | imagePullPolicy: Always
16 | command: ["/bin/bash", "-c", "./migration_runner.py"]
17 | restartPolicy: Never
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/testenv/jobs/database_test_job.yml:
--------------------------------------------------------------------------------
1 | ---
2 | apiVersion: batch/v1
3 | kind: Job
4 | metadata:
5 | name: db-test-job
6 | namespace: sqldevops
7 | spec:
8 | template:
9 | metadata:
10 | name: db-test-job
11 | spec:
12 | containers:
13 | - name: db-test-job
14 | image: ericskang/mssql-slacker:controller
15 | imagePullPolicy: Always
16 | command: ["/bin/sh", "-c", "/usr/local/bin/python ./run_tests.py -s nginx-lb -p 6000"]
17 | restartPolicy: Never
18 |
19 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/testenv/namespace.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Namespace
3 | metadata:
4 | name: sqldevops
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes/statefulset/testenv/nginx_loadbalacer.yml:
--------------------------------------------------------------------------------
1 | ---
2 | kind: Service
3 | apiVersion: v1
4 | metadata:
5 | name: nginx-lb
6 | namespace: sqldevops
7 | spec:
8 | selector:
9 | app: loadbalancer
10 | ports:
11 | - protocol: TCP
12 | port: 6000
13 | targetPort: 6000
14 | nodePort: 30188
15 | type: NodePort
16 |
17 | ---
18 | apiVersion: apps/v1beta1
19 | kind: Deployment
20 | metadata:
21 | name: nginx-lb
22 | namespace: sqldevops
23 | spec:
24 | replicas: 1
25 | template:
26 | metadata:
27 | labels:
28 | app: loadbalancer
29 | spec:
30 | containers:
31 | - name: nginx-lb
32 | image: ericskang/slacker-lb:nginx
33 | imagePullPolicy: Always
34 | ports:
35 | - containerPort: 6000
36 |
37 |
--------------------------------------------------------------------------------
/docker_cluster/kubernetes_azure/az:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/docker_cluster/kubernetes_azure/az
--------------------------------------------------------------------------------
/docker_cluster/kubernetes_azure/common_samples/kubectl_commands.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # get cluster / service / deployment and pod info
4 | clear
5 | kubectl cluster-info
6 | kubectl get services -n sqldevops-dev
7 | kubectl get deployments -n sqldevops-dev
8 | kubectl get pods -n sqldevops-dev
9 |
10 | # spining up / down
11 | clear
12 | kubectl scale deployment mssql --replicas=10 -n sqldevops
13 | watch kubectl get pods -n sqldevops-dev
14 |
15 | clear
16 | kubectl scale deployment mssql --replicas=1 -n sqldevops
17 | watch kubectl get pods -n sqldevops-dev
--------------------------------------------------------------------------------
/docker_cluster/kubernetes_azure/common_samples/management/persistent_volumes.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # https://kubernetes.io/docs/concepts/storage/persistent-volumes/
--------------------------------------------------------------------------------
/docker_cluster/kubernetes_azure/namespace.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Namespace
3 | metadata:
4 | name: sqldevops
--------------------------------------------------------------------------------
/docker_cluster/loadbalancer/slacker/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM nginx:alpine
2 |
3 | WORKDIR /etc/nginx/conf.d
4 | COPY ./default.conf ./default.conf
5 |
6 | EXPOSE 6000
7 |
8 | CMD ["nginx", "-g", "daemon off;"]
--------------------------------------------------------------------------------
/docker_cluster/loadbalancer/slacker/default.conf:
--------------------------------------------------------------------------------
1 | upstream slacker_backend {
2 | server slacker-0.slacker.sqldevops.svc.cluster.local:8000;
3 | server slacker-1.slacker.sqldevops.svc.cluster.local:8000;
4 | }
5 |
6 | server {
7 | listen 6000;
8 | server_name localhost;
9 | location / {
10 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
11 | proxy_pass http://slacker_backend;
12 | }
13 | }
--------------------------------------------------------------------------------
/docker_cluster/loadbalancer/slacker/docker_build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | docker build . --rm -t ericskang/slacker-lb:nginx
4 | docker push ericskang/slacker-lb:nginx
5 |
6 | docker rmi -f $(docker images -f "dangling=true" -q)
7 |
--------------------------------------------------------------------------------
/docker_cluster/mssql_jobs/backup/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ericskang/sqltools:sqlcmd
2 |
3 | WORKDIR /opt/sql-jobs
4 |
5 | COPY ./full-backup.sql .
6 | COPY ./full-backup.sh .
7 | COPY ./log-backup.sql .
8 | COPY ./log-backup.sh .
9 |
--------------------------------------------------------------------------------
/docker_cluster/mssql_jobs/backup/docker_build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | docker build . --rm --squash -t ericskang/cronjobs:backup
4 | docker push ericskang/cronjobs:backup
5 |
6 | docker rmi -f $(docker images -f "dangling=true" -q)
7 |
--------------------------------------------------------------------------------
/docker_cluster/mssql_jobs/backup/full-backup.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | sqlcmd -Smssql -Usa -PSqlDevOps2017 -i ./full-backup.sql
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/docker_cluster/mssql_jobs/backup/log-backup.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | sqlcmd -Smssql -Usa -PSqlDevOps2017 -i ./log-backup.sql
--------------------------------------------------------------------------------
/docker_cluster/mssql_jobs/backup/log-backup.sql:
--------------------------------------------------------------------------------
1 | select @@version;
2 | print N'demo simulation for logbackup every 5 minute';
--------------------------------------------------------------------------------
/docker_cluster/mssql_jobs/provisioning/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ericskang/sqltools:sqlcmd
2 |
3 | WORKDIR /opt/sql-provisioning-job
4 |
5 | COPY ./restore.sql .
6 | COPY ./adventureworks-restore.sql .
7 | COPY ./provision.sh .
8 |
9 |
--------------------------------------------------------------------------------
/docker_cluster/mssql_jobs/provisioning/adventureworks-restore.sql:
--------------------------------------------------------------------------------
1 | RESTORE DATABASE [AdventureWorks]
2 | FROM DISK = N'/tmp/backup/AdventureWorks2014.bak'
3 | WITH FILE = 1, MOVE N'AdventureWorks2014_Data'
4 | TO N'/var/opt/mssql/data/AdventureWorks_Data.mdf',
5 | MOVE N'AdventureWorks2014_Log'
6 | TO N'/var/opt/mssql/data/AdventureWorks_Log.ldf', NOUNLOAD, STATS = 5
7 |
--------------------------------------------------------------------------------
/docker_cluster/mssql_jobs/provisioning/docker_build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | docker build . --rm --squash -t ericskang/db-provisioning-job:mssql
4 | docker push ericskang/db-provisioning-job:mssql
5 |
6 | docker rmi -f $(docker images -f "dangling=true" -q)
7 |
--------------------------------------------------------------------------------
/docker_cluster/mssql_jobs/provisioning/provision.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | sqlcmd -Smssql -Usa -PSqlDevOps2017 -i ./restore.sql
4 | sqlcmd -Smssql -Usa -PSqlDevOps2017 -i ./adventureworks-restore.sql
--------------------------------------------------------------------------------
/docker_cluster/mssql_jobs/provisioning/restore.sql:
--------------------------------------------------------------------------------
1 | RESTORE DATABASE WideWorldImporters FROM DISK = "/tmp/backup/WideWorldImporters-Full.bak"
2 | WITH MOVE "WWI_Primary" TO "/var/opt/mssql/data/WideWorldImporters.mdf",
3 | MOVE "WWI_Userdata" TO "/var/opt/mssql/data/WideWorldImporters_Userdata.mdf",
4 | MOVE "WWI_Log" TO "/var/opt/mssql/data/WideWorldImporters.ldf", MOVE "WWI_InMemory_Data_1"
5 | TO "/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1"
--------------------------------------------------------------------------------
/docker_cluster/mssql_unittest/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM microsoft/mssql-server-linux:latest
2 |
3 | ENV SA_PASSWORD SqlDevOps2017
4 | ENV MSSQL_PID Developer
5 |
6 | ENV MSSQLTOOLS_ROOT /opt/mssql-tools
7 | ENV PATH "$MSSQLTOOLS_ROOT/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
8 |
9 | WORKDIR /var/opt/mssql/backup
10 | RUN wget https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v0.2/WideWorldImporters-Full.bak
11 |
12 | WORKDIR /opt/var/scripts
13 | RUN wget https://github.com/erickangMSFT/sqldevops/blob/master/data_sanitization/sql/restore.sql
14 |
15 | CMD /opt/mssql/bin/sqlservr
16 |
--------------------------------------------------------------------------------
/docker_cluster/mssql_unittest/docker_build_push_demo.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | docker pull microsoft/mssql-server-linux:latest
4 |
5 | docker run --name unittestdb -e "ACCEPT_EULA=Y" -p 1433:1433 -d microsoft/mssql-server-linuxt:latest
6 |
7 | pwsh ./sanitize_data_reduce_size.ps1
8 |
9 | docker commit unittestdb sqlpass.azurecr.io/mssql-dev-db-image:latest
10 |
11 | docker push sqlpass.azurecr.io/mssql-dev-db-image:latest
12 |
13 |
--------------------------------------------------------------------------------
/docker_cluster/mssql_unittest/docker_push.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | echo 'starting data sanitization'
3 | cd ../../data_sanitization
4 | powershell ./create_unittest_db.ps1
5 |
6 | dt=`date '+%Y-%m-%d_%H-%M-%S'`
7 |
8 | docker commit unittestdb ericskang/unittestdb:$dt
9 | docker tag ericskang/unittestdb:$dt ericskang/unittestdb:latest
10 |
11 | docker push ericskang/unittestdb:$dt
12 | docker push ericskang/unittestdb:latest
--------------------------------------------------------------------------------
/docker_cluster/pgsql_jobs/provisioning/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM alpine:latest
2 |
3 | RUN apk add --update postgresql-client openssl unzip bash && rm -rf /var/cache/apk/*
4 | ENV PGPASSWORD SqlDevOps2017
5 |
6 | WORKDIR /opt/pg-provisioning-job
7 | COPY ./provisioning.sh .
8 | RUN chmod +x ./provisioning.sh
9 |
10 |
--------------------------------------------------------------------------------
/docker_cluster/pgsql_jobs/provisioning/docker_build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | docker build . --rm -t ericskang/db-provisioning-job:pgsql
4 | docker push ericskang/db-provisioning-job:pgsql
5 |
6 | docker rmi -f $(docker images -f "dangling=true" -q)
7 |
--------------------------------------------------------------------------------
/docker_cluster/pgsql_jobs/provisioning/provisioning.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | print ** downloading pagila sample database
4 | wget -q https://ftp.postgresql.org/pub/projects/pgFoundry/dbsamples/pagila/pagila/pagila-0.10.1.zip
5 | unzip ./pagila-0.10.1.zip
6 | rm ./pagila-0.10.1.zip
7 |
8 | PGPASSWORD='SqlDevOps2017'
9 |
10 | print ** creating pagila database
11 | psql -h pgsql -U sa -c "CREATE DATABASE pagila;"
12 |
13 | print ** creating schema in pagila database
14 | psql -h pgsql -U sa -f ./pagila-0.10.1/pagila-schema.sql pagila
15 |
16 | print ** inserting data to pagila database
17 | psql -h pgsql -U sa -f ./pagila-0.10.1/pagila-insert-data.sql pagila
18 |
--------------------------------------------------------------------------------
/docker_cluster/slacker/docker_build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | docker build . --rm -t slacker:alpine
4 |
5 | docker rmi -f $(docker images -f "dangling=true" -q)
6 |
7 | docker images
8 |
--------------------------------------------------------------------------------
/docker_cluster/slacker/docker_push.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | docker login
4 |
5 | dt=`date '+%Y-%m-%d_%H-%M-%S'`
6 | echo $dt
7 | docker tag slacker:alpine ericskang/mssql-slacker:$dt
8 | docker tag ericskang/mssql-slacker:$dt ericskang/mssql-slacker:latest
9 |
10 | docker push ericskang/mssql-slacker:$dt
11 | docker push ericskang/mssql-slacker:latest
12 |
13 | docker rmi -f $(docker images -f "dangling=true" -q)
--------------------------------------------------------------------------------
/docker_cluster/slacker/gemrc:
--------------------------------------------------------------------------------
1 | ---
2 | :sources:
3 | - http://rubygems.org
4 | :benchmark: false
5 | :update_sources: true
6 | :backtrace: true
7 | :verbose: true
8 | gem: --no-ri --no-rdoc
9 | install: --no-rdoc --no-ri
10 | update: --no-rdoc --no-ri
11 |
--------------------------------------------------------------------------------
/docker_cluster/slacker_runner/docker_build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | #wget https://raw.githubusercontent.com/exAspArk/docker-alpine-ruby/master/gemrc
3 | docker build . --rm -t slacker-node-runner:alpine
4 |
5 | dt=`date '+%Y-%m-%d_%H-%M-%S'`
6 | docker tag slacker-node-runner:alpine ericskang/slacker-node-runner:$dt
7 | docker tag ericskang/slacker-node-runner:$dt ericskang/slacker-node-runner:latest
8 |
9 | docker push ericskang/slacker-node-runner:$dt
10 | docker push ericskang/slacker-node-runner:latest
11 |
--------------------------------------------------------------------------------
/docker_cluster/slacker_runner/gemrc:
--------------------------------------------------------------------------------
1 | ---
2 | :sources:
3 | - http://rubygems.org
4 | :benchmark: false
5 | :update_sources: true
6 | :backtrace: true
7 | :verbose: true
8 | gem: --no-ri --no-rdoc
9 | install: --no-rdoc --no-ri
10 | update: --no-rdoc --no-ri
11 |
--------------------------------------------------------------------------------
/docker_cluster/swarm/docker-stack.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | docker stack deploy -c docker-compose.yml sqldevops
4 |
5 | docker stack ps sqldevops
--------------------------------------------------------------------------------
/docker_cluster/tools/docker_build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 |
4 | dt=`date '+%Y-%m-%d_%H-%M-%S'`
5 |
6 | docker build . --rm -t ericskang/sqltools:$dt
7 |
8 | docker tag ericskang/sqltools:$dt ericskang/sqltools:latest
9 |
10 | docker login
11 |
12 | docker push ericskang/sqltools:$dt
13 | docker push ericskang/sqltools:latest
14 |
15 | docker rmi -f $(docker images -f "dangling=true" -q)
16 |
--------------------------------------------------------------------------------
/docker_cluster/tools/sqlcmd/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ubuntu:latest
2 |
3 | RUN apt-get update && apt-get install -y curl apt-transport-https && apt-get clean
4 |
5 | RUN curl -s https://packages.microsoft.com/keys/microsoft.asc | apt-key add - && curl -s https://packages.microsoft.com/config/ubuntu/16.04/prod.list | tee /etc/apt/sources.list.d/msprod.list
6 | ENV ACCEPT_EULA y
7 |
8 | RUN apt-get update && apt-get install -y mssql-tools unixodbc-dev locales \
9 | && rm -rf /var/lib/apt/lists/* \
10 | && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 \
11 | && apt-get clean
12 |
13 | ENV LANG en_US.utf8
14 | ENV MSSQLTOOLS_ROOT /opt/mssql-tools
15 | ENV PATH "$MSSQLTOOLS_ROOT/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
16 |
17 | CMD tail -f /dev/null
18 |
--------------------------------------------------------------------------------
/docker_cluster/tools/sqlcmd/docker_build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | docker build . --rm --squash --compress -t ericskang/sqltools:sqlcmd
4 |
5 | docker login
6 |
7 | docker push ericskang/sqltools:sqlcmd
8 |
9 | docker rmi -f $(docker images -f "dangling=true" -q)
10 |
--------------------------------------------------------------------------------
/test_controller/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM python:2-alpine3.6
2 |
3 | WORKDIR /app/src/controller
4 |
5 | COPY run_tests.py .
6 |
7 |
8 |
--------------------------------------------------------------------------------
/test_controller/docker_build_push.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # initial build including wwi backup files and restore script
4 | docker build . --rm -t ericskang/mssql-slacker:controller
5 |
6 | docker login
7 | docker push ericskang/mssql-slacker:controller
8 |
9 | docker rmi -f $(docker images -f "dangling=true" -q)
10 |
--------------------------------------------------------------------------------
/test_controller/get_kube_info.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # this demo script is based on
4 | # local kubernetes cluster setup
5 | # deployed sqldevops namespace
6 | # and slacker service is deployed as NodePort type
7 |
8 | kubectl get services -n $kube_namespace
9 | kubectl describe nodes | grep -e 'Name:' -e 'IP' -e 'Addresses' -e 'slacker' -e 'webapp' -e 'sqltools' -e 'mssql'
10 |
--------------------------------------------------------------------------------
/test_controller/get_test_pods.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | kubectl describe pods -n sqldevops | grep -e 'slackeri-' -e 'PORT:' -e 'Name:' -e 'IP:' -e 'Status:'
4 |
--------------------------------------------------------------------------------
/test_controller/scale_k8s.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | kubectl scale deployment slacker --replicas=3 -n sqldevops
4 | watch kubectl get pods -n sqldevops
5 |
--------------------------------------------------------------------------------
/test_runner/.dockerignore:
--------------------------------------------------------------------------------
1 | runner/node_modules
2 | docker-compose.yml
3 | Dockerfile
4 | *.ps1
5 | *.sh
6 |
--------------------------------------------------------------------------------
/test_runner/config/slackerRunner.yml:
--------------------------------------------------------------------------------
1 | # Slacker node runner configuration
2 |
3 | # port: expose port for slacker node runner.
4 | # specs.rootFolder: the full folder path of your slacker test project.
5 | # specs.specFolder: the root level spec folder path. Typically it is under 'spec' folder.
6 | port: 8000
7 | specs:
8 | rootFolder: /opt/var/slacker_runner/test
9 | specFolder: /opt/var/slacker_runner/test/spec
10 |
--------------------------------------------------------------------------------
/test_runner/gulpfile.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const gulp = require('gulp');
4 | const nodemon = require('gulp-nodemon');
5 | // const eslint = require('gulp-eslint');
6 |
7 | const jsFiles = ['*.js', './src/**/*.js'];
8 |
9 | gulp.task('default', ()=> {
10 | nodemon({
11 | script: './bin/www',
12 | ext: 'js',
13 | env: {
14 | PORT: 8000,
15 | },
16 | ignore: ['./node_modules/**'],
17 | })
18 | .on('restart', function() {
19 | console.log('Restarting...');
20 | });
21 | });
--------------------------------------------------------------------------------
/test_runner/modules/runnerconfig.js:
--------------------------------------------------------------------------------
1 | const yaml = require('js-yaml');
2 | const fs = require('fs');
3 |
4 | (() => {
5 | module.exports = {
6 | getConfig: getConfig
7 | };
8 |
9 | function getConfig(yamlFile) {
10 | // Get document, or throw exception on error
11 | try {
12 | var config = yaml.safeLoad(fs.readFileSync(yamlFile, 'utf8'));
13 | } catch (e) {
14 | console.log(e);
15 | }
16 | return config;
17 | }
18 | })();
--------------------------------------------------------------------------------
/test_runner/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "runner",
3 | "version": "0.0.0",
4 | "private": true,
5 | "scripts": {
6 | "start": "node ./bin/www"
7 | },
8 | "dependencies": {
9 | "ejs": "^2.5.7",
10 | "express": "~4.15.2",
11 | "js-yaml": "^3.9.1",
12 | "marked": "^0.3.6"
13 | },
14 | "devDependencies": {
15 | "gulp": "^3.9.1",
16 | "gulp-nodemon": "^2.2.1",
17 | "debug": "~2.6.3"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/test_runner/routes/index.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var router = express.Router();
3 | var marked = require('marked');
4 | var fs = require('fs');
5 |
6 | marked.setOptions({
7 | renderer: new marked.Renderer(),
8 | gfm: true,
9 | tables: true,
10 | breaks: false,
11 | pedantic: false,
12 | sanitize: true,
13 | smartLists: true,
14 | smartypants: false
15 | });
16 |
17 |
18 | /* GET home page. */
19 | router.get('/', function (req, res, next) {
20 | mdFile = './views/docs/index.md';
21 | mdtext = marked((fs.readFileSync(mdFile, 'utf8')));
22 | res.render('index', {md: mdtext});
23 | });
24 |
25 |
26 | module.exports = router;
27 |
--------------------------------------------------------------------------------
/test_runner/views/index.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 | slacker node runner
4 |
5 |
6 |
7 | <%- md %>
8 |
9 |
10 |
--------------------------------------------------------------------------------
/tools_demo/init/create_databases.sql:
--------------------------------------------------------------------------------
1 | use master;
2 | go
3 |
4 | create database [ToolsTest];
5 | GO
6 | create database [ClinicDB];
7 | GO
8 | create database [WorldWideImporters]
9 | GO
10 | create database [Sqlmmo]
11 | GO
12 | create database [LobDB];
13 | GO
14 | create database [PGSQLmigration];
15 | GO
16 |
17 | backup database WorldWideImporters to disk = N'/backups/WorldWideImporters.bak';
18 | GO
19 | backup database ClinicDB to disk = N'/backups/clinic.bak';
20 | GO
21 | backup database toolstest to disk = N'/backups/toolstest.bak';
22 | GO
--------------------------------------------------------------------------------
/tools_demo/init/init_docker.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # This script starts mssql and postgres containers.
4 |
5 | # pull docker images
6 | docker pull microsoft/mssql-server-linux:latest
7 | docker pull postgres:latest
8 | docker images
9 |
10 | # start mssql container using persistent volume and restart always option
11 | docker run --name mssql -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=SqlDevOps2017' \
12 | --cap-add SYS_PTRACE -p 1433:1433 -v sqlvol:/var/opt/mssql \
13 | --restart=always -d microsoft/mssql-server-linux
14 |
15 |
16 | # start pgsql container
17 | docker run --name postgres -e POSTGRES_USER=sa -e POSTGRES_PASSWORD=SqlDevOps2017 \
18 | -p 5432:5432 --restart=always -d -v pgvol:/usr/local/pgsql/data postgres:latest
19 |
20 | # check the running status of containers
21 | docker ps
22 |
--------------------------------------------------------------------------------
/tools_demo/pg/pgsql/init_db.sql:
--------------------------------------------------------------------------------
1 | create database PostgresDemo;
2 |
3 | CREATE TABLE employee (
4 | id SERIAL, --emp id; auto-increment when empty
5 | name varchar(20), --emp name
6 | dept varchar(10), --department
7 | salary int --employee's salary
8 | );
9 |
10 | INSERT INTO employee VALUES (100,'Thomas','Sales',5000);
11 | INSERT INTO employee VALUES (200,'Jason','Technology',5500);
12 | INSERT INTO employee VALUES (300,'Mayla','Technology',7000);
13 | INSERT INTO employee VALUES (400,'Nisha','Marketing',9500);
14 | INSERT INTO employee VALUES (500,'Randy','Technology',6000);
15 |
16 | SELECT * FROM employee;
--------------------------------------------------------------------------------
/tools_demo/pg/pgsql/pg_stats.sql:
--------------------------------------------------------------------------------
1 | SELECT max(now() - xact_start) FROM pg_stat_activity
2 | WHERE state IN ('idle in transaction', 'active');
--------------------------------------------------------------------------------
/tools_demo/pg/pgsql/table_size.sql:
--------------------------------------------------------------------------------
1 | SELECT
2 | table_schema || '.' || table_name AS table_full_name,
3 | pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') AS size
4 | FROM information_schema.tables
5 | where pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') > 0
6 | ORDER BY
7 | pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC
8 | LIMIT 10
--------------------------------------------------------------------------------
/tools_demo/sql/backup_insight.sql:
--------------------------------------------------------------------------------
1 | declare @condition tinyint;
2 | SET @condition = 24;
3 | with
4 | backupInsight_cte (database_id, last_backup, health_check)
5 | as
6 | (
7 | select d.database_id, max(b.backup_start_date) AS last_backup, case when (datediff( hh , max(b.backup_start_date) , getdate()) > @condition) then 1 else 0 end as health_check
8 | from sys.databases as d left join msdb..backupset as b on d.name = b.database_name
9 | group by d.database_id
10 | )
11 | select sum(health_check) [Within 24hrs], sum(case when health_check = 0 AND last_backup IS NOT NULL then 1 else 0 end) [Older than 24hrs], sum(case when health_check = 0 then 1 else 0 end) [No backup found]
12 | from backupInsight_cte
--------------------------------------------------------------------------------
/tools_demo/sql/db_size.sql:
--------------------------------------------------------------------------------
1 | with fs
2 | as
3 | (
4 | select database_id, type, size * 8.0 / 1024 size
5 | from sys.master_files
6 | )
7 | select
8 | name,
9 | (select sum(size) from fs where type = 0 and fs.database_id = db.database_id) DataFileSizeMB,
10 | (select sum(size) from fs where type = 1 and fs.database_id = db.database_id) LogFileSizeMB
11 | from sys.databases db
12 | --where database_id > 4
--------------------------------------------------------------------------------
/tools_demo/sql/diskusage.sql:
--------------------------------------------------------------------------------
1 | WITH t(s) AS
2 | (
3 | SELECT CONVERT(DECIMAL(18,2), SUM(size)*8/1024.0)
4 | FROM sys.database_files
5 | WHERE [type] % 2 = 0
6 | ),
7 | d(s) AS
8 | (
9 | SELECT CONVERT(DECIMAL(18,2), SUM(total_pages)*8/1024.0)
10 | FROM sys.partitions AS p
11 | INNER JOIN sys.allocation_units AS a
12 | ON p.[partition_id] = a.container_id
13 | )
14 | SELECT
15 | Used_Space = d.s,
16 | Available_Space = t.s - d.s
17 | FROM t CROSS APPLY d;
--------------------------------------------------------------------------------
/tools_demo/sql/sql2017.sql:
--------------------------------------------------------------------------------
1 | SELECT planForceDetails.query_id, reason, score,
2 | JSON_VALUE(details, '$.implementationDetails.script') script,
3 | planForceDetails.[new plan_id], planForceDetails.[recommended plan_id]
4 | FROM sys.dm_db_tuning_recommendations
5 | CROSS APPLY OPENJSON (Details, '$.planForceDetails')
6 | WITH ( [query_id] int '$.queryId',
7 | [new plan_id] int '$.regressedPlanId',
8 | [recommended plan_id] int '$.forcedPlanId'
9 | ) as planForceDetails;
--------------------------------------------------------------------------------
/tools_demo/sql/wwi_vtemp.sql:
--------------------------------------------------------------------------------
1 | SELECT
2 | TOP 2000
3 | ChillerSensorNumber,
4 | RecordedWhen,
5 | Temperature
6 | FROM Website.VehicleTemperatures
7 | ORDER BY RecordedWhen ASC
--------------------------------------------------------------------------------
/vsts/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '2'
2 | services:
3 | webapp:
4 | image: ericskang/webapp:latest
5 | depends_on:
6 | - mssql
7 | container_name: webapp
8 | ports:
9 | - "80:3000"
10 | mssql:
11 | image: ericskang/unittestdb:latest
12 | container_name: mssql
13 | ports:
14 | - "1433:1433"
15 | environment:
16 | SA_PASSWORD: "SqlDevOps2017"
17 | ACCEPT_EULA: "Y"
18 | MSSQL_PID: Developer
19 |
--------------------------------------------------------------------------------
/vsts/linux_agent/agent_cleanup.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | docker rm -f $(docker ps -a -q)
4 | docker rmi -f $(docker images -q)
--------------------------------------------------------------------------------
/web_app/.bowerrc:
--------------------------------------------------------------------------------
1 | {"directory":"public/lib"}
--------------------------------------------------------------------------------
/web_app/.dockerignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | npm-debug.log
--------------------------------------------------------------------------------
/web_app/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | "env": {
3 | "browser": true,
4 | "es6": true,
5 | "node": true
6 | },
7 | "extends": "eslint:recommended",
8 | "rules": {
9 | "linebreak-style": [
10 | "error",
11 | "unix"
12 | ],
13 | "quotes": [
14 | "error",
15 | "single"
16 | ],
17 | "semi": [
18 | "error",
19 | "always"
20 | ],
21 | "no-unused-vars": 0,
22 | "no-console": 0
23 | }
24 | };
--------------------------------------------------------------------------------
/web_app/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:boron-alpine
2 | # Create app directory
3 | WORKDIR /usr/src/app
4 | # Install app dependencies
5 | COPY package.json .
6 | COPY package-lock.json .
7 | RUN npm install --only=production
8 | # Bundle app source
9 | COPY . .
10 | EXPOSE 3000
11 | CMD [ "node", "./bin/www" ]
--------------------------------------------------------------------------------
/web_app/docker_build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | dt=`date '+%Y-%m-%d_%H-%M-%S'`
4 | docker build . --rm -t ericskang/webapp:$dt
5 | docker tag ericskang/webapp:$dt ericskang/webapp:latest
6 |
7 | docker push ericskang/webapp:$dt
8 | docker push ericskang/webapp:latest
9 |
10 | # docker rmi -f $(docker images -f "dangling=true" -q)
11 |
12 | # docker rmi -f ericskang/webapp:$dt
13 | # docker rmi -f ericskang/webapp:latest
14 | # docker rmi -f node:alpine
15 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | Bootstrap uses [GitHub's Releases feature](https://github.com/blog/1547-release-your-software) for its changelogs.
2 |
3 | See [the Releases section of our GitHub project](https://github.com/twbs/bootstrap/releases) for changelogs for each release version of Bootstrap.
4 |
5 | Release announcement posts on [the official Bootstrap blog](http://blog.getbootstrap.com) contain summaries of the most noteworthy changes made in each release.
6 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/Gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | group :development, :test do
4 | gem 'jekyll', '~> 3.1.2'
5 | gem 'jekyll-sitemap', '~> 0.11.0'
6 | end
7 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "bootstrap",
3 | "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
4 | "keywords": [
5 | "css",
6 | "js",
7 | "less",
8 | "mobile-first",
9 | "responsive",
10 | "front-end",
11 | "framework",
12 | "web"
13 | ],
14 | "homepage": "http://getbootstrap.com",
15 | "license": "MIT",
16 | "moduleType": "globals",
17 | "main": [
18 | "less/bootstrap.less",
19 | "dist/js/bootstrap.js"
20 | ],
21 | "ignore": [
22 | "/.*",
23 | "_config.yml",
24 | "CNAME",
25 | "composer.json",
26 | "CONTRIBUTING.md",
27 | "docs",
28 | "js/tests",
29 | "test-infra"
30 | ],
31 | "dependencies": {
32 | "jquery": "1.9.1 - 3"
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/dist/js/npm.js:
--------------------------------------------------------------------------------
1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
2 | require('../../js/transition.js')
3 | require('../../js/alert.js')
4 | require('../../js/button.js')
5 | require('../../js/carousel.js')
6 | require('../../js/collapse.js')
7 | require('../../js/dropdown.js')
8 | require('../../js/modal.js')
9 | require('../../js/tooltip.js')
10 | require('../../js/popover.js')
11 | require('../../js/scrollspy.js')
12 | require('../../js/tab.js')
13 | require('../../js/affix.js')
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/bootstrap/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/grunt/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "extends" : "../js/.jshintrc",
3 | "asi" : false,
4 | "browser" : false,
5 | "es3" : false,
6 | "node" : true
7 | }
8 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/js/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "asi" : true,
3 | "browser" : true,
4 | "eqeqeq" : false,
5 | "eqnull" : true,
6 | "es3" : true,
7 | "expr" : true,
8 | "jquery" : true,
9 | "latedef" : true,
10 | "laxbreak" : true,
11 | "nonbsp" : true,
12 | "strict" : true,
13 | "undef" : true,
14 | "unused" : true
15 | }
16 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/.csslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "adjoining-classes": false,
3 | "box-sizing": false,
4 | "box-model": false,
5 | "compatible-vendor-prefixes": false,
6 | "floats": false,
7 | "font-sizes": false,
8 | "gradients": false,
9 | "important": false,
10 | "known-properties": false,
11 | "outline-none": false,
12 | "qualified-headings": false,
13 | "regex-selectors": false,
14 | "shorthand": false,
15 | "text-indent": false,
16 | "unique-headings": false,
17 | "universal-selector": false,
18 | "unqualified-attributes": false
19 | }
20 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/breadcrumbs.less:
--------------------------------------------------------------------------------
1 | //
2 | // Breadcrumbs
3 | // --------------------------------------------------
4 |
5 |
6 | .breadcrumb {
7 | padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;
8 | margin-bottom: @line-height-computed;
9 | list-style: none;
10 | background-color: @breadcrumb-bg;
11 | border-radius: @border-radius-base;
12 |
13 | > li {
14 | display: inline-block;
15 |
16 | + li:before {
17 | content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space
18 | padding: 0 5px;
19 | color: @breadcrumb-color;
20 | }
21 | }
22 |
23 | > .active {
24 | color: @breadcrumb-active-color;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/alerts.less:
--------------------------------------------------------------------------------
1 | // Alerts
2 |
3 | .alert-variant(@background; @border; @text-color) {
4 | background-color: @background;
5 | border-color: @border;
6 | color: @text-color;
7 |
8 | hr {
9 | border-top-color: darken(@border, 5%);
10 | }
11 | .alert-link {
12 | color: darken(@text-color, 10%);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/background-variant.less:
--------------------------------------------------------------------------------
1 | // Contextual backgrounds
2 |
3 | .bg-variant(@color) {
4 | background-color: @color;
5 | a&:hover,
6 | a&:focus {
7 | background-color: darken(@color, 10%);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/border-radius.less:
--------------------------------------------------------------------------------
1 | // Single side border-radius
2 |
3 | .border-top-radius(@radius) {
4 | border-top-right-radius: @radius;
5 | border-top-left-radius: @radius;
6 | }
7 | .border-right-radius(@radius) {
8 | border-bottom-right-radius: @radius;
9 | border-top-right-radius: @radius;
10 | }
11 | .border-bottom-radius(@radius) {
12 | border-bottom-right-radius: @radius;
13 | border-bottom-left-radius: @radius;
14 | }
15 | .border-left-radius(@radius) {
16 | border-bottom-left-radius: @radius;
17 | border-top-left-radius: @radius;
18 | }
19 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/center-block.less:
--------------------------------------------------------------------------------
1 | // Center-align a block level element
2 |
3 | .center-block() {
4 | display: block;
5 | margin-left: auto;
6 | margin-right: auto;
7 | }
8 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/clearfix.less:
--------------------------------------------------------------------------------
1 | // Clearfix
2 | //
3 | // For modern browsers
4 | // 1. The space content is one way to avoid an Opera bug when the
5 | // contenteditable attribute is included anywhere else in the document.
6 | // Otherwise it causes space to appear at the top and bottom of elements
7 | // that are clearfixed.
8 | // 2. The use of `table` rather than `block` is only necessary if using
9 | // `:before` to contain the top-margins of child elements.
10 | //
11 | // Source: http://nicolasgallagher.com/micro-clearfix-hack/
12 |
13 | .clearfix() {
14 | &:before,
15 | &:after {
16 | content: " "; // 1
17 | display: table; // 2
18 | }
19 | &:after {
20 | clear: both;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/hide-text.less:
--------------------------------------------------------------------------------
1 | // CSS image replacement
2 | //
3 | // Heads up! v3 launched with only `.hide-text()`, but per our pattern for
4 | // mixins being reused as classes with the same name, this doesn't hold up. As
5 | // of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.
6 | //
7 | // Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
8 |
9 | // Deprecated as of v3.0.1 (has been removed in v4)
10 | .hide-text() {
11 | font: ~"0/0" a;
12 | color: transparent;
13 | text-shadow: none;
14 | background-color: transparent;
15 | border: 0;
16 | }
17 |
18 | // New mixin to use as of v3.0.1
19 | .text-hide() {
20 | .hide-text();
21 | }
22 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/labels.less:
--------------------------------------------------------------------------------
1 | // Labels
2 |
3 | .label-variant(@color) {
4 | background-color: @color;
5 |
6 | &[href] {
7 | &:hover,
8 | &:focus {
9 | background-color: darken(@color, 10%);
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/list-group.less:
--------------------------------------------------------------------------------
1 | // List Groups
2 |
3 | .list-group-item-variant(@state; @background; @color) {
4 | .list-group-item-@{state} {
5 | color: @color;
6 | background-color: @background;
7 |
8 | a&,
9 | button& {
10 | color: @color;
11 |
12 | .list-group-item-heading {
13 | color: inherit;
14 | }
15 |
16 | &:hover,
17 | &:focus {
18 | color: @color;
19 | background-color: darken(@background, 5%);
20 | }
21 | &.active,
22 | &.active:hover,
23 | &.active:focus {
24 | color: #fff;
25 | background-color: @color;
26 | border-color: @color;
27 | }
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/nav-divider.less:
--------------------------------------------------------------------------------
1 | // Horizontal dividers
2 | //
3 | // Dividers (basically an hr) within dropdowns and nav lists
4 |
5 | .nav-divider(@color: #e5e5e5) {
6 | height: 1px;
7 | margin: ((@line-height-computed / 2) - 1) 0;
8 | overflow: hidden;
9 | background-color: @color;
10 | }
11 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/nav-vertical-align.less:
--------------------------------------------------------------------------------
1 | // Navbar vertical align
2 | //
3 | // Vertically center elements in the navbar.
4 | // Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
5 |
6 | .navbar-vertical-align(@element-height) {
7 | margin-top: ((@navbar-height - @element-height) / 2);
8 | margin-bottom: ((@navbar-height - @element-height) / 2);
9 | }
10 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/opacity.less:
--------------------------------------------------------------------------------
1 | // Opacity
2 |
3 | .opacity(@opacity) {
4 | opacity: @opacity;
5 | // IE8 filter
6 | @opacity-ie: (@opacity * 100);
7 | filter: ~"alpha(opacity=@{opacity-ie})";
8 | }
9 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/pagination.less:
--------------------------------------------------------------------------------
1 | // Pagination
2 |
3 | .pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
4 | > li {
5 | > a,
6 | > span {
7 | padding: @padding-vertical @padding-horizontal;
8 | font-size: @font-size;
9 | line-height: @line-height;
10 | }
11 | &:first-child {
12 | > a,
13 | > span {
14 | .border-left-radius(@border-radius);
15 | }
16 | }
17 | &:last-child {
18 | > a,
19 | > span {
20 | .border-right-radius(@border-radius);
21 | }
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/panels.less:
--------------------------------------------------------------------------------
1 | // Panels
2 |
3 | .panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {
4 | border-color: @border;
5 |
6 | & > .panel-heading {
7 | color: @heading-text-color;
8 | background-color: @heading-bg-color;
9 | border-color: @heading-border;
10 |
11 | + .panel-collapse > .panel-body {
12 | border-top-color: @border;
13 | }
14 | .badge {
15 | color: @heading-bg-color;
16 | background-color: @heading-text-color;
17 | }
18 | }
19 | & > .panel-footer {
20 | + .panel-collapse > .panel-body {
21 | border-bottom-color: @border;
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/progress-bar.less:
--------------------------------------------------------------------------------
1 | // Progress bars
2 |
3 | .progress-bar-variant(@color) {
4 | background-color: @color;
5 |
6 | // Deprecated parent class requirement as of v3.2.0
7 | .progress-striped & {
8 | #gradient > .striped();
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/reset-filter.less:
--------------------------------------------------------------------------------
1 | // Reset filters for IE
2 | //
3 | // When you need to remove a gradient background, do not forget to use this to reset
4 | // the IE filter for IE9 and below.
5 |
6 | .reset-filter() {
7 | filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
8 | }
9 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/reset-text.less:
--------------------------------------------------------------------------------
1 | .reset-text() {
2 | font-family: @font-family-base;
3 | // We deliberately do NOT reset font-size.
4 | font-style: normal;
5 | font-weight: normal;
6 | letter-spacing: normal;
7 | line-break: auto;
8 | line-height: @line-height-base;
9 | text-align: left; // Fallback for where `start` is not supported
10 | text-align: start;
11 | text-decoration: none;
12 | text-shadow: none;
13 | text-transform: none;
14 | white-space: normal;
15 | word-break: normal;
16 | word-spacing: normal;
17 | word-wrap: normal;
18 | }
19 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/resize.less:
--------------------------------------------------------------------------------
1 | // Resize anything
2 |
3 | .resizable(@direction) {
4 | resize: @direction; // Options: horizontal, vertical, both
5 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
6 | }
7 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/responsive-visibility.less:
--------------------------------------------------------------------------------
1 | // Responsive utilities
2 |
3 | //
4 | // More easily include all the states for responsive-utilities.less.
5 | .responsive-visibility() {
6 | display: block !important;
7 | table& { display: table !important; }
8 | tr& { display: table-row !important; }
9 | th&,
10 | td& { display: table-cell !important; }
11 | }
12 |
13 | .responsive-invisibility() {
14 | display: none !important;
15 | }
16 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/size.less:
--------------------------------------------------------------------------------
1 | // Sizing shortcuts
2 |
3 | .size(@width; @height) {
4 | width: @width;
5 | height: @height;
6 | }
7 |
8 | .square(@size) {
9 | .size(@size; @size);
10 | }
11 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/tab-focus.less:
--------------------------------------------------------------------------------
1 | // WebKit-style focus
2 |
3 | .tab-focus() {
4 | // WebKit-specific. Other browsers will keep their default outline style.
5 | // (Initially tried to also force default via `outline: initial`,
6 | // but that seems to erroneously remove the outline in Firefox altogether.)
7 | outline: 5px auto -webkit-focus-ring-color;
8 | outline-offset: -2px;
9 | }
10 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/text-emphasis.less:
--------------------------------------------------------------------------------
1 | // Typography
2 |
3 | .text-emphasis-variant(@color) {
4 | color: @color;
5 | a&:hover,
6 | a&:focus {
7 | color: darken(@color, 10%);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/mixins/text-overflow.less:
--------------------------------------------------------------------------------
1 | // Text overflow
2 | // Requires inline-block or block for proper styling
3 |
4 | .text-overflow() {
5 | overflow: hidden;
6 | text-overflow: ellipsis;
7 | white-space: nowrap;
8 | }
9 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/responsive-embed.less:
--------------------------------------------------------------------------------
1 | // Embeds responsive
2 | //
3 | // Credit: Nicolas Gallagher and SUIT CSS.
4 |
5 | .embed-responsive {
6 | position: relative;
7 | display: block;
8 | height: 0;
9 | padding: 0;
10 | overflow: hidden;
11 |
12 | .embed-responsive-item,
13 | iframe,
14 | embed,
15 | object,
16 | video {
17 | position: absolute;
18 | top: 0;
19 | left: 0;
20 | bottom: 0;
21 | height: 100%;
22 | width: 100%;
23 | border: 0;
24 | }
25 | }
26 |
27 | // Modifier class for 16:9 aspect ratio
28 | .embed-responsive-16by9 {
29 | padding-bottom: 56.25%;
30 | }
31 |
32 | // Modifier class for 4:3 aspect ratio
33 | .embed-responsive-4by3 {
34 | padding-bottom: 75%;
35 | }
36 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/less/wells.less:
--------------------------------------------------------------------------------
1 | //
2 | // Wells
3 | // --------------------------------------------------
4 |
5 |
6 | // Base class
7 | .well {
8 | min-height: 20px;
9 | padding: 19px;
10 | margin-bottom: 20px;
11 | background-color: @well-bg;
12 | border: 1px solid @well-border;
13 | border-radius: @border-radius-base;
14 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
15 | blockquote {
16 | border-color: #ddd;
17 | border-color: rgba(0,0,0,.15);
18 | }
19 | }
20 |
21 | // Sizes
22 | .well-lg {
23 | padding: 24px;
24 | border-radius: @border-radius-large;
25 | }
26 | .well-sm {
27 | padding: 9px;
28 | border-radius: @border-radius-small;
29 | }
30 |
--------------------------------------------------------------------------------
/web_app/public/lib/bootstrap/nuget/MyGet.ps1:
--------------------------------------------------------------------------------
1 | $nuget = $env:NuGet
2 |
3 | # parse the version number out of package.json
4 | $bsversion = ((Get-Content $env:SourcesPath\package.json) -join "`n" | ConvertFrom-Json).version
5 |
6 | # create packages
7 | & $nuget pack "nuget\bootstrap.nuspec" -Verbosity detailed -NonInteractive -NoPackageAnalysis -BasePath $env:SourcesPath -Version $bsversion
8 | & $nuget pack "nuget\bootstrap.less.nuspec" -Verbosity detailed -NonInteractive -NoPackageAnalysis -BasePath $env:SourcesPath -Version $bsversion
9 |
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/.bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "chart.js",
3 | "description": "Simple HTML5 charts using the canvas element.",
4 | "homepage": "http://www.chartjs.org",
5 | "license": "MIT",
6 | "version": "2.6.0",
7 | "main": "./dist/Chart.js",
8 | "ignore": [
9 | ".github",
10 | ".codeclimate.yml",
11 | ".gitignore",
12 | ".npmignore",
13 | ".travis.yml",
14 | "scripts"
15 | ],
16 | "_release": "2.6.0",
17 | "_resolution": {
18 | "type": "version",
19 | "tag": "v2.6.0",
20 | "commit": "6ae9829bf505df9ac17c945c934feb88ee6cf880"
21 | },
22 | "_source": "https://github.com/chartjs/Chart.js.git",
23 | "_target": "^2.6.0",
24 | "_originalSource": "chart.js",
25 | "_direct": true
26 | }
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/.editorconfig:
--------------------------------------------------------------------------------
1 | # http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_style = tab
6 | indent_size = 4
7 | end_of_line = lf
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = false
11 |
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/.eslintignore:
--------------------------------------------------------------------------------
1 | **/*{.,-}min.js
2 |
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/book.json:
--------------------------------------------------------------------------------
1 | {
2 | "root": "./docs",
3 | "author": "chartjs",
4 | "gitbook": "3.2.2",
5 | "plugins": ["-lunr", "-search", "search-plus", "anchorjs", "chartjs", "ga"],
6 | "pluginsConfig": {
7 | "anchorjs": {
8 | "icon": "#",
9 | "placement": "left",
10 | "visible": "always"
11 | },
12 | "ga": {
13 | "token": "UA-28909194-3",
14 | "configuration": "auto"
15 | },
16 | "theme-default": {
17 | "showLevel": false,
18 | "styles": {
19 | "website": "style.css"
20 | }
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "chart.js",
3 | "description": "Simple HTML5 charts using the canvas element.",
4 | "homepage": "http://www.chartjs.org",
5 | "license": "MIT",
6 | "version": "2.6.0",
7 | "main": "./dist/Chart.js",
8 | "ignore": [
9 | ".github",
10 | ".codeclimate.yml",
11 | ".gitignore",
12 | ".npmignore",
13 | ".travis.yml",
14 | "scripts"
15 | ]
16 | }
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nnnick/chartjs",
3 | "type": "library",
4 | "description": "Simple HTML5 charts using the canvas element.",
5 | "keywords": [
6 | "chart",
7 | "js"
8 | ],
9 | "homepage": "http://www.chartjs.org/",
10 | "license": "MIT",
11 | "authors": [
12 | {
13 | "name": "NICK DOWNIE",
14 | "email": "hello@nickdownie.com"
15 | }
16 | ],
17 | "require": {
18 | "php": ">=5.3.3"
19 | },
20 | "minimum-stability": "stable",
21 | "extra": {
22 | "branch-alias": {
23 | "release/2.0": "v2.0-dev"
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/docs/axes/cartesian/logarithmic.md:
--------------------------------------------------------------------------------
1 | # Logarithmic Cartesian Axis
2 |
3 | The logarithmic scale is use to chart numerical data. It can be placed on either the x or y axis. As the name suggests, logarithmic interpolation is used to determine where a value lies on the axis.
4 |
5 | ## Tick Configuration Options
6 |
7 | The following options are provided by the logarithmic scale. They are all located in the `ticks` sub options. These options extend the [common tick configuration](README.md#tick-configuration).
8 |
9 | | Name | Type | Default | Description
10 | | -----| ---- | --------| -----------
11 | | `min` | `Number` | | User defined minimum number for the scale, overrides minimum value from data.
12 | | `max` | `Number` | | User defined maximum number for the scale, overrides maximum value from data.
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/docs/axes/radial/README.md:
--------------------------------------------------------------------------------
1 | # Radial Axes
2 |
3 | Radial axes are used specifically for the radar and polar area chart types. These axes overlay the chart area, rather than being positioned on one of the edges. One radial axis is included by default in Chart.js.
4 |
5 | * [linear](./linear.md#linear-radial-axis)
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/docs/charts/README.md:
--------------------------------------------------------------------------------
1 | # Charts
2 |
3 | Chart.js comes with built-in chart types:
4 | * [line](./line.md)
5 | * [bar](./bar.md)
6 | * [radar](./radar.md)
7 | * [polar area](./polar.md)
8 | * [doughnut and pie](./doughnut.md)
9 | * [bubble](./bubble.md)
10 |
11 | [Area charts](area.md) can be built from a line or radar chart using the dataset `fill` option.
12 |
13 | To create a new chart type, see the [developer notes](../developers/charts.md#new-charts)
14 |
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/docs/general/README.md:
--------------------------------------------------------------------------------
1 | # General Chart.js Configuration
2 |
3 | These sections describe general configuration options that can apply elsewhere in the documentation.
4 |
5 | * [Colors](./colors.md) defines acceptable color values
6 | * [Font](./fonts.md) defines various font options
7 | * [Interactions](./interactions/README.md) defines options that reflect how hovering chart elements works
8 | * [Responsive](./responsive.md) defines responsive chart options that apply to all charts.
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/docs/general/interactions/README.md:
--------------------------------------------------------------------------------
1 | # Interactions
2 |
3 | The hover configuration is passed into the `options.hover` namespace. The global hover configuration is at `Chart.defaults.global.hover`. To configure which events trigger chart interactions, see [events](./events.md#events).
4 |
5 | | Name | Type | Default | Description
6 | | ---- | ---- | ------- | -----------
7 | | `mode` | `String` | `'nearest'` | Sets which elements appear in the tooltip. See [Interaction Modes](./modes.md#interaction-modes) for details.
8 | | `intersect` | `Boolean` | `true` | if true, the hover mode only applies when the mouse position intersects an item on the chart.
9 | | `animationDuration` | `Number` | `400` | Duration in milliseconds it takes to animate hover style changes.
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/docs/notes/README.md:
--------------------------------------------------------------------------------
1 | # Additional Notes
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/docs/notes/license.md:
--------------------------------------------------------------------------------
1 | # License
2 |
3 | Chart.js is open source and available under the MIT license.
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/docs/style.css:
--------------------------------------------------------------------------------
1 | a.anchorjs-link {
2 | color: rgba(65, 131, 196, 0.1);
3 | font-weight: 400;
4 | text-decoration: none;
5 | transition: color 100ms ease-out;
6 | z-index: 999;
7 | }
8 |
9 | a.anchorjs-link:hover {
10 | color: rgba(65, 131, 196, 1);
11 | }
12 |
13 | sup {
14 | font-size: 0.75em !important;
15 | }
16 |
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/samples/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/samples/favicon.ico
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/samples/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/src/charts/Chart.Bar.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | module.exports = function(Chart) {
4 |
5 | Chart.Bar = function(context, config) {
6 | config.type = 'bar';
7 |
8 | return new Chart(context, config);
9 | };
10 |
11 | };
12 |
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/src/charts/Chart.Bubble.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | module.exports = function(Chart) {
4 |
5 | Chart.Bubble = function(context, config) {
6 | config.type = 'bubble';
7 | return new Chart(context, config);
8 | };
9 |
10 | };
11 |
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/src/charts/Chart.Doughnut.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | module.exports = function(Chart) {
4 |
5 | Chart.Doughnut = function(context, config) {
6 | config.type = 'doughnut';
7 |
8 | return new Chart(context, config);
9 | };
10 |
11 | };
12 |
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/src/charts/Chart.Line.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | module.exports = function(Chart) {
4 |
5 | Chart.Line = function(context, config) {
6 | config.type = 'line';
7 |
8 | return new Chart(context, config);
9 | };
10 |
11 | };
12 |
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/src/charts/Chart.PolarArea.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | module.exports = function(Chart) {
4 |
5 | Chart.PolarArea = function(context, config) {
6 | config.type = 'polarArea';
7 |
8 | return new Chart(context, config);
9 | };
10 |
11 | };
12 |
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/src/charts/Chart.Radar.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | module.exports = function(Chart) {
4 |
5 | Chart.Radar = function(context, config) {
6 | config.type = 'radar';
7 |
8 | return new Chart(context, config);
9 | };
10 |
11 | };
12 |
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-end-span.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-end-span.png
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-end.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-end.png
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-origin-span.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-origin-span.png
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-origin-spline-span.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-origin-spline-span.png
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-origin-spline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-origin-spline.png
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-origin-stepped-span.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-origin-stepped-span.png
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-origin-stepped.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-origin-stepped.png
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-origin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-origin.png
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-start-span.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-start-span.png
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-boundary-start.png
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-dataset-span.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-dataset-span.png
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-dataset-spline-span.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-dataset-spline-span.png
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-dataset-spline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-dataset-spline.png
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-dataset.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-line-dataset.png
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-radar-boundary-origin-spline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-radar-boundary-origin-spline.png
--------------------------------------------------------------------------------
/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-radar-boundary-origin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/chart.js/test/fixtures/plugin.filler/fill-radar-boundary-origin.png
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/.gitignore:
--------------------------------------------------------------------------------
1 | *.pyc
2 | *.egg-info
3 | *.db
4 | *.db.old
5 | *.swp
6 | *.db-journal
7 |
8 | .coverage
9 | .DS_Store
10 | .installed.cfg
11 | _gh_pages/*
12 |
13 | .idea/*
14 | .svn/*
15 | src/website/static/*
16 | src/website/media/*
17 |
18 | bin
19 | cfcache
20 | develop-eggs
21 | dist
22 | downloads
23 | eggs
24 | parts
25 | tmp
26 | .sass-cache
27 | node_modules
28 |
29 | src/website/settingslocal.py
30 | stunnel.log
31 |
32 | .ruby-version
33 | .bundle
34 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/.npmignore:
--------------------------------------------------------------------------------
1 | *.pyc
2 | *.egg-info
3 | *.db
4 | *.db.old
5 | *.swp
6 | *.db-journal
7 |
8 | .coverage
9 | .DS_Store
10 | .installed.cfg
11 | _gh_pages/*
12 |
13 | .idea/*
14 | .svn/*
15 | src/website/static/*
16 | src/website/media/*
17 |
18 | bin
19 | cfcache
20 | develop-eggs
21 | dist
22 | downloads
23 | eggs
24 | parts
25 | tmp
26 | .sass-cache
27 | node_modules
28 |
29 | src/website/settingslocal.py
30 | stunnel.log
31 |
32 | .ruby-version
33 |
34 | # don't need these in the npm package.
35 | src/
36 | _config.yml
37 | bower.json
38 | component.json
39 | composer.json
40 | CONTRIBUTING.md
41 | Gemfile
42 | Gemfile.lock
43 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/HELP-US-OUT.txt:
--------------------------------------------------------------------------------
1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project,
2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome,
3 | comprehensive icon sets or copy and paste your own.
4 |
5 | Please. Check it out.
6 |
7 | -Dave Gandy
8 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "font-awesome",
3 | "description": "Font Awesome",
4 | "keywords": [],
5 | "homepage": "http://fontawesome.io",
6 | "dependencies": {},
7 | "devDependencies": {},
8 | "license": ["OFL-1.1", "MIT", "CC-BY-3.0"],
9 | "main": [
10 | "less/font-awesome.less",
11 | "scss/font-awesome.scss"
12 | ],
13 | "ignore": [
14 | "*/.*",
15 | "*.json",
16 | "src",
17 | "*.yml",
18 | "Gemfile",
19 | "Gemfile.lock",
20 | "*.md"
21 | ]
22 | }
23 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/font-awesome/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/font-awesome/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/font-awesome/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/font-awesome/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/public/lib/font-awesome/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/less/bordered-pulled.less:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-border {
5 | padding: .2em .25em .15em;
6 | border: solid .08em @fa-border-color;
7 | border-radius: .1em;
8 | }
9 |
10 | .@{fa-css-prefix}-pull-left { float: left; }
11 | .@{fa-css-prefix}-pull-right { float: right; }
12 |
13 | .@{fa-css-prefix} {
14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; }
15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; }
16 | }
17 |
18 | /* Deprecated as of 4.4.0 */
19 | .pull-right { float: right; }
20 | .pull-left { float: left; }
21 |
22 | .@{fa-css-prefix} {
23 | &.pull-left { margin-right: .3em; }
24 | &.pull-right { margin-left: .3em; }
25 | }
26 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/less/core.less:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .@{fa-css-prefix} {
5 | display: inline-block;
6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
7 | font-size: inherit; // can't have font-size inherit on line above, so need to override
8 | text-rendering: auto; // optimizelegibility throws things off #1094
9 | -webkit-font-smoothing: antialiased;
10 | -moz-osx-font-smoothing: grayscale;
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/less/fixed-width.less:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .@{fa-css-prefix}-fw {
4 | width: (18em / 14);
5 | text-align: center;
6 | }
7 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/less/font-awesome.less:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 |
6 | @import "variables.less";
7 | @import "mixins.less";
8 | @import "path.less";
9 | @import "core.less";
10 | @import "larger.less";
11 | @import "fixed-width.less";
12 | @import "list.less";
13 | @import "bordered-pulled.less";
14 | @import "animated.less";
15 | @import "rotated-flipped.less";
16 | @import "stacked.less";
17 | @import "icons.less";
18 | @import "screen-reader.less";
19 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/less/larger.less:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | /* makes the font 33% larger relative to the icon container */
5 | .@{fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -15%;
9 | }
10 | .@{fa-css-prefix}-2x { font-size: 2em; }
11 | .@{fa-css-prefix}-3x { font-size: 3em; }
12 | .@{fa-css-prefix}-4x { font-size: 4em; }
13 | .@{fa-css-prefix}-5x { font-size: 5em; }
14 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/less/list.less:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-ul {
5 | padding-left: 0;
6 | margin-left: @fa-li-width;
7 | list-style-type: none;
8 | > li { position: relative; }
9 | }
10 | .@{fa-css-prefix}-li {
11 | position: absolute;
12 | left: -@fa-li-width;
13 | width: @fa-li-width;
14 | top: (2em / 14);
15 | text-align: center;
16 | &.@{fa-css-prefix}-lg {
17 | left: (-@fa-li-width + (4em / 14));
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/less/rotated-flipped.less:
--------------------------------------------------------------------------------
1 | // Rotated & Flipped Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
7 |
8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
10 |
11 | // Hook for IE8-9
12 | // -------------------------
13 |
14 | :root .@{fa-css-prefix}-rotate-90,
15 | :root .@{fa-css-prefix}-rotate-180,
16 | :root .@{fa-css-prefix}-rotate-270,
17 | :root .@{fa-css-prefix}-flip-horizontal,
18 | :root .@{fa-css-prefix}-flip-vertical {
19 | filter: none;
20 | }
21 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/less/screen-reader.less:
--------------------------------------------------------------------------------
1 | // Screen Readers
2 | // -------------------------
3 |
4 | .sr-only { .sr-only(); }
5 | .sr-only-focusable { .sr-only-focusable(); }
6 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/less/stacked.less:
--------------------------------------------------------------------------------
1 | // Stacked Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-stack {
5 | position: relative;
6 | display: inline-block;
7 | width: 2em;
8 | height: 2em;
9 | line-height: 2em;
10 | vertical-align: middle;
11 | }
12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
13 | position: absolute;
14 | left: 0;
15 | width: 100%;
16 | text-align: center;
17 | }
18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; }
19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; }
20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; }
21 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/scss/_bordered-pulled.scss:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-border {
5 | padding: .2em .25em .15em;
6 | border: solid .08em $fa-border-color;
7 | border-radius: .1em;
8 | }
9 |
10 | .#{$fa-css-prefix}-pull-left { float: left; }
11 | .#{$fa-css-prefix}-pull-right { float: right; }
12 |
13 | .#{$fa-css-prefix} {
14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
16 | }
17 |
18 | /* Deprecated as of 4.4.0 */
19 | .pull-right { float: right; }
20 | .pull-left { float: left; }
21 |
22 | .#{$fa-css-prefix} {
23 | &.pull-left { margin-right: .3em; }
24 | &.pull-right { margin-left: .3em; }
25 | }
26 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/scss/_core.scss:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix} {
5 | display: inline-block;
6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
7 | font-size: inherit; // can't have font-size inherit on line above, so need to override
8 | text-rendering: auto; // optimizelegibility throws things off #1094
9 | -webkit-font-smoothing: antialiased;
10 | -moz-osx-font-smoothing: grayscale;
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/scss/_fixed-width.scss:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .#{$fa-css-prefix}-fw {
4 | width: (18em / 14);
5 | text-align: center;
6 | }
7 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/scss/_larger.scss:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | /* makes the font 33% larger relative to the icon container */
5 | .#{$fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -15%;
9 | }
10 | .#{$fa-css-prefix}-2x { font-size: 2em; }
11 | .#{$fa-css-prefix}-3x { font-size: 3em; }
12 | .#{$fa-css-prefix}-4x { font-size: 4em; }
13 | .#{$fa-css-prefix}-5x { font-size: 5em; }
14 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/scss/_list.scss:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-ul {
5 | padding-left: 0;
6 | margin-left: $fa-li-width;
7 | list-style-type: none;
8 | > li { position: relative; }
9 | }
10 | .#{$fa-css-prefix}-li {
11 | position: absolute;
12 | left: -$fa-li-width;
13 | width: $fa-li-width;
14 | top: (2em / 14);
15 | text-align: center;
16 | &.#{$fa-css-prefix}-lg {
17 | left: -$fa-li-width + (4em / 14);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/scss/_rotated-flipped.scss:
--------------------------------------------------------------------------------
1 | // Rotated & Flipped Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
7 |
8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
10 |
11 | // Hook for IE8-9
12 | // -------------------------
13 |
14 | :root .#{$fa-css-prefix}-rotate-90,
15 | :root .#{$fa-css-prefix}-rotate-180,
16 | :root .#{$fa-css-prefix}-rotate-270,
17 | :root .#{$fa-css-prefix}-flip-horizontal,
18 | :root .#{$fa-css-prefix}-flip-vertical {
19 | filter: none;
20 | }
21 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/scss/_screen-reader.scss:
--------------------------------------------------------------------------------
1 | // Screen Readers
2 | // -------------------------
3 |
4 | .sr-only { @include sr-only(); }
5 | .sr-only-focusable { @include sr-only-focusable(); }
6 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/scss/_stacked.scss:
--------------------------------------------------------------------------------
1 | // Stacked Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-stack {
5 | position: relative;
6 | display: inline-block;
7 | width: 2em;
8 | height: 2em;
9 | line-height: 2em;
10 | vertical-align: middle;
11 | }
12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
13 | position: absolute;
14 | left: 0;
15 | width: 100%;
16 | text-align: center;
17 | }
18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; }
19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; }
20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; }
21 |
--------------------------------------------------------------------------------
/web_app/public/lib/font-awesome/scss/font-awesome.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 |
6 | @import "variables";
7 | @import "mixins";
8 | @import "path";
9 | @import "core";
10 | @import "larger";
11 | @import "fixed-width";
12 | @import "list";
13 | @import "bordered-pulled";
14 | @import "animated";
15 | @import "rotated-flipped";
16 | @import "stacked";
17 | @import "icons";
18 | @import "screen-reader";
19 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/.bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "jquery",
3 | "main": "dist/jquery.js",
4 | "license": "MIT",
5 | "ignore": [
6 | "package.json"
7 | ],
8 | "keywords": [
9 | "jquery",
10 | "javascript",
11 | "browser",
12 | "library"
13 | ],
14 | "homepage": "https://github.com/jquery/jquery-dist",
15 | "version": "3.2.1",
16 | "_release": "3.2.1",
17 | "_resolution": {
18 | "type": "version",
19 | "tag": "3.2.1",
20 | "commit": "77d2a51d0520d2ee44173afdf4e40a9201f5964e"
21 | },
22 | "_source": "https://github.com/jquery/jquery-dist.git",
23 | "_target": "1.9.1 - 3",
24 | "_originalSource": "jquery"
25 | }
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "jquery",
3 | "main": "dist/jquery.js",
4 | "license": "MIT",
5 | "ignore": [
6 | "package.json"
7 | ],
8 | "keywords": [
9 | "jquery",
10 | "javascript",
11 | "browser",
12 | "library"
13 | ]
14 | }
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "root": true,
3 |
4 | "extends": "../.eslintrc-browser.json"
5 | }
6 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/ajax/parseXML.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../core"
3 | ], function( jQuery ) {
4 |
5 | "use strict";
6 |
7 | // Cross-browser xml parsing
8 | jQuery.parseXML = function( data ) {
9 | var xml;
10 | if ( !data || typeof data !== "string" ) {
11 | return null;
12 | }
13 |
14 | // Support: IE 9 - 11 only
15 | // IE throws on parseFromString with invalid input.
16 | try {
17 | xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
18 | } catch ( e ) {
19 | xml = undefined;
20 | }
21 |
22 | if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
23 | jQuery.error( "Invalid XML: " + data );
24 | }
25 | return xml;
26 | };
27 |
28 | return jQuery.parseXML;
29 |
30 | } );
31 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/ajax/var/location.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | return window.location;
5 | } );
6 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/ajax/var/nonce.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../../core"
3 | ], function( jQuery ) {
4 | "use strict";
5 |
6 | return jQuery.now();
7 | } );
8 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/ajax/var/rquery.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | return ( /\?/ );
5 | } );
6 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/attributes.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "./core",
3 | "./attributes/attr",
4 | "./attributes/prop",
5 | "./attributes/classes",
6 | "./attributes/val"
7 | ], function( jQuery ) {
8 |
9 | "use strict";
10 |
11 | // Return jQuery for attributes-only inclusion
12 | return jQuery;
13 | } );
14 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/core/DOMEval.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../var/document"
3 | ], function( document ) {
4 | "use strict";
5 |
6 | function DOMEval( code, doc ) {
7 | doc = doc || document;
8 |
9 | var script = doc.createElement( "script" );
10 |
11 | script.text = code;
12 | doc.head.appendChild( script ).parentNode.removeChild( script );
13 | }
14 |
15 | return DOMEval;
16 | } );
17 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/core/nodeName.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 |
3 | "use strict";
4 |
5 | function nodeName( elem, name ) {
6 |
7 | return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
8 |
9 | };
10 |
11 | return nodeName;
12 |
13 | } );
14 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/core/readyException.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../core"
3 | ], function( jQuery ) {
4 |
5 | "use strict";
6 |
7 | jQuery.readyException = function( error ) {
8 | window.setTimeout( function() {
9 | throw error;
10 | } );
11 | };
12 |
13 | } );
14 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/core/stripAndCollapse.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../var/rnothtmlwhite"
3 | ], function( rnothtmlwhite ) {
4 | "use strict";
5 |
6 | // Strip and collapse whitespace according to HTML spec
7 | // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
8 | function stripAndCollapse( value ) {
9 | var tokens = value.match( rnothtmlwhite ) || [];
10 | return tokens.join( " " );
11 | }
12 |
13 | return stripAndCollapse;
14 | } );
15 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/core/support.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../var/document",
3 | "../var/support"
4 | ], function( document, support ) {
5 |
6 | "use strict";
7 |
8 | // Support: Safari 8 only
9 | // In Safari 8 documents created via document.implementation.createHTMLDocument
10 | // collapse sibling forms: the second one becomes a child of the first one.
11 | // Because of that, this security measure has to be disabled in Safari 8.
12 | // https://bugs.webkit.org/show_bug.cgi?id=137337
13 | support.createHTMLDocument = ( function() {
14 | var body = document.implementation.createHTMLDocument( "" ).body;
15 | body.innerHTML = "";
16 | return body.childNodes.length === 2;
17 | } )();
18 |
19 | return support;
20 | } );
21 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/core/var/rsingleTag.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | // Match a standalone tag
5 | return ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
6 | } );
7 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/css/addGetHookIf.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 |
3 | "use strict";
4 |
5 | function addGetHookIf( conditionFn, hookFn ) {
6 |
7 | // Define the hook, we'll check on the first run if it's really needed.
8 | return {
9 | get: function() {
10 | if ( conditionFn() ) {
11 |
12 | // Hook not needed (or it's not possible to use it due
13 | // to missing dependency), remove it.
14 | delete this.get;
15 | return;
16 | }
17 |
18 | // Hook needed; redefine it so that the support test is not executed again.
19 | return ( this.get = hookFn ).apply( this, arguments );
20 | }
21 | };
22 | }
23 |
24 | return addGetHookIf;
25 |
26 | } );
27 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/css/hiddenVisibleSelectors.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../core",
3 | "../selector"
4 | ], function( jQuery ) {
5 |
6 | "use strict";
7 |
8 | jQuery.expr.pseudos.hidden = function( elem ) {
9 | return !jQuery.expr.pseudos.visible( elem );
10 | };
11 | jQuery.expr.pseudos.visible = function( elem ) {
12 | return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
13 | };
14 |
15 | } );
16 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/css/var/cssExpand.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | return [ "Top", "Right", "Bottom", "Left" ];
5 | } );
6 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/css/var/getStyles.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | return function( elem ) {
5 |
6 | // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
7 | // IE throws on elements created in popups
8 | // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
9 | var view = elem.ownerDocument.defaultView;
10 |
11 | if ( !view || !view.opener ) {
12 | view = window;
13 | }
14 |
15 | return view.getComputedStyle( elem );
16 | };
17 | } );
18 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/css/var/rmargin.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | return ( /^margin/ );
5 | } );
6 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/css/var/rnumnonpx.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../../var/pnum"
3 | ], function( pnum ) {
4 | "use strict";
5 |
6 | return new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
7 | } );
8 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/css/var/swap.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 |
3 | "use strict";
4 |
5 | // A method for quickly swapping in/out CSS properties to get correct calculations.
6 | return function( elem, options, callback, args ) {
7 | var ret, name,
8 | old = {};
9 |
10 | // Remember the old values, and insert the new ones
11 | for ( name in options ) {
12 | old[ name ] = elem.style[ name ];
13 | elem.style[ name ] = options[ name ];
14 | }
15 |
16 | ret = callback.apply( elem, args || [] );
17 |
18 | // Revert the old values
19 | for ( name in options ) {
20 | elem.style[ name ] = old[ name ];
21 | }
22 |
23 | return ret;
24 | };
25 |
26 | } );
27 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/data/var/acceptData.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 |
3 | "use strict";
4 |
5 | /**
6 | * Determines whether an object can have data
7 | */
8 | return function( owner ) {
9 |
10 | // Accepts only:
11 | // - Node
12 | // - Node.ELEMENT_NODE
13 | // - Node.DOCUMENT_NODE
14 | // - Object
15 | // - Any
16 | return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
17 | };
18 |
19 | } );
20 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/data/var/dataPriv.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../Data"
3 | ], function( Data ) {
4 | "use strict";
5 |
6 | return new Data();
7 | } );
8 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/data/var/dataUser.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../Data"
3 | ], function( Data ) {
4 | "use strict";
5 |
6 | return new Data();
7 | } );
8 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/deferred/exceptionHook.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../core",
3 | "../deferred"
4 | ], function( jQuery ) {
5 |
6 | "use strict";
7 |
8 | // These usually indicate a programmer mistake during development,
9 | // warn about them ASAP rather than swallowing them by default.
10 | var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
11 |
12 | jQuery.Deferred.exceptionHook = function( error, stack ) {
13 |
14 | // Support: IE 8 - 9 only
15 | // Console exists when dev tools are open, which can happen at any time
16 | if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
17 | window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
18 | }
19 | };
20 |
21 | } );
22 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/effects/animatedSelector.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../core",
3 | "../selector",
4 | "../effects"
5 | ], function( jQuery ) {
6 |
7 | "use strict";
8 |
9 | jQuery.expr.pseudos.animated = function( elem ) {
10 | return jQuery.grep( jQuery.timers, function( fn ) {
11 | return elem === fn.elem;
12 | } ).length;
13 | };
14 |
15 | } );
16 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/event/ajax.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../core",
3 | "../event"
4 | ], function( jQuery ) {
5 |
6 | "use strict";
7 |
8 | // Attach a bunch of functions for handling common AJAX events
9 | jQuery.each( [
10 | "ajaxStart",
11 | "ajaxStop",
12 | "ajaxComplete",
13 | "ajaxError",
14 | "ajaxSuccess",
15 | "ajaxSend"
16 | ], function( i, type ) {
17 | jQuery.fn[ type ] = function( fn ) {
18 | return this.on( type, fn );
19 | };
20 | } );
21 |
22 | } );
23 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/event/alias.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../core",
3 |
4 | "../event",
5 | "./trigger"
6 | ], function( jQuery ) {
7 |
8 | "use strict";
9 |
10 | jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
11 | "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
12 | "change select submit keydown keypress keyup contextmenu" ).split( " " ),
13 | function( i, name ) {
14 |
15 | // Handle event binding
16 | jQuery.fn[ name ] = function( data, fn ) {
17 | return arguments.length > 0 ?
18 | this.on( name, null, data, fn ) :
19 | this.trigger( name );
20 | };
21 | } );
22 |
23 | jQuery.fn.extend( {
24 | hover: function( fnOver, fnOut ) {
25 | return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
26 | }
27 | } );
28 |
29 | } );
30 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/event/support.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../var/support"
3 | ], function( support ) {
4 |
5 | "use strict";
6 |
7 | support.focusin = "onfocusin" in window;
8 |
9 | return support;
10 |
11 | } );
12 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/exports/global.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../core"
3 | ], function( jQuery, noGlobal ) {
4 |
5 | "use strict";
6 |
7 | var
8 |
9 | // Map over jQuery in case of overwrite
10 | _jQuery = window.jQuery,
11 |
12 | // Map over the $ in case of overwrite
13 | _$ = window.$;
14 |
15 | jQuery.noConflict = function( deep ) {
16 | if ( window.$ === jQuery ) {
17 | window.$ = _$;
18 | }
19 |
20 | if ( deep && window.jQuery === jQuery ) {
21 | window.jQuery = _jQuery;
22 | }
23 |
24 | return jQuery;
25 | };
26 |
27 | // Expose jQuery and $ identifiers, even in AMD
28 | // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
29 | // and CommonJS for browser emulators (#13566)
30 | if ( !noGlobal ) {
31 | window.jQuery = window.$ = jQuery;
32 | }
33 |
34 | } );
35 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/manipulation/_evalUrl.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../ajax"
3 | ], function( jQuery ) {
4 |
5 | "use strict";
6 |
7 | jQuery._evalUrl = function( url ) {
8 | return jQuery.ajax( {
9 | url: url,
10 |
11 | // Make this explicit, since user can override this through ajaxSetup (#11264)
12 | type: "GET",
13 | dataType: "script",
14 | cache: true,
15 | async: false,
16 | global: false,
17 | "throws": true
18 | } );
19 | };
20 |
21 | return jQuery._evalUrl;
22 |
23 | } );
24 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/manipulation/getAll.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../core",
3 | "../core/nodeName"
4 | ], function( jQuery, nodeName ) {
5 |
6 | "use strict";
7 |
8 | function getAll( context, tag ) {
9 |
10 | // Support: IE <=9 - 11 only
11 | // Use typeof to avoid zero-argument method invocation on host objects (#15151)
12 | var ret;
13 |
14 | if ( typeof context.getElementsByTagName !== "undefined" ) {
15 | ret = context.getElementsByTagName( tag || "*" );
16 |
17 | } else if ( typeof context.querySelectorAll !== "undefined" ) {
18 | ret = context.querySelectorAll( tag || "*" );
19 |
20 | } else {
21 | ret = [];
22 | }
23 |
24 | if ( tag === undefined || tag && nodeName( context, tag ) ) {
25 | return jQuery.merge( [ context ], ret );
26 | }
27 |
28 | return ret;
29 | }
30 |
31 | return getAll;
32 | } );
33 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/manipulation/setGlobalEval.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../data/var/dataPriv"
3 | ], function( dataPriv ) {
4 |
5 | "use strict";
6 |
7 | // Mark scripts as having already been evaluated
8 | function setGlobalEval( elems, refElements ) {
9 | var i = 0,
10 | l = elems.length;
11 |
12 | for ( ; i < l; i++ ) {
13 | dataPriv.set(
14 | elems[ i ],
15 | "globalEval",
16 | !refElements || dataPriv.get( refElements[ i ], "globalEval" )
17 | );
18 | }
19 | }
20 |
21 | return setGlobalEval;
22 | } );
23 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/manipulation/var/rcheckableType.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | return ( /^(?:checkbox|radio)$/i );
5 | } );
6 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/manipulation/var/rscriptType.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | return ( /^$|\/(?:java|ecma)script/i );
5 | } );
6 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/manipulation/var/rtagName.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | return ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
5 | } );
6 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/queue/delay.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../core",
3 | "../queue",
4 | "../effects" // Delay is optional because of this dependency
5 | ], function( jQuery ) {
6 |
7 | "use strict";
8 |
9 | // Based off of the plugin by Clint Helfers, with permission.
10 | // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
11 | jQuery.fn.delay = function( time, type ) {
12 | time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
13 | type = type || "fx";
14 |
15 | return this.queue( type, function( next, hooks ) {
16 | var timeout = window.setTimeout( next, time );
17 | hooks.stop = function() {
18 | window.clearTimeout( timeout );
19 | };
20 | } );
21 | };
22 |
23 | return jQuery.fn.delay;
24 | } );
25 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/selector-sizzle.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "./core",
3 | "../external/sizzle/dist/sizzle"
4 | ], function( jQuery, Sizzle ) {
5 |
6 | "use strict";
7 |
8 | jQuery.find = Sizzle;
9 | jQuery.expr = Sizzle.selectors;
10 |
11 | // Deprecated
12 | jQuery.expr[ ":" ] = jQuery.expr.pseudos;
13 | jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
14 | jQuery.text = Sizzle.getText;
15 | jQuery.isXMLDoc = Sizzle.isXML;
16 | jQuery.contains = Sizzle.contains;
17 | jQuery.escapeSelector = Sizzle.escape;
18 |
19 | } );
20 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/selector.js:
--------------------------------------------------------------------------------
1 | define( [ "./selector-sizzle" ], function() {
2 | "use strict";
3 | } );
4 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/traversing/var/dir.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../../core"
3 | ], function( jQuery ) {
4 |
5 | "use strict";
6 |
7 | return function( elem, dir, until ) {
8 | var matched = [],
9 | truncate = until !== undefined;
10 |
11 | while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
12 | if ( elem.nodeType === 1 ) {
13 | if ( truncate && jQuery( elem ).is( until ) ) {
14 | break;
15 | }
16 | matched.push( elem );
17 | }
18 | }
19 | return matched;
20 | };
21 |
22 | } );
23 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/traversing/var/rneedsContext.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../../core",
3 | "../../selector"
4 | ], function( jQuery ) {
5 | "use strict";
6 |
7 | return jQuery.expr.match.needsContext;
8 | } );
9 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/traversing/var/siblings.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 |
3 | "use strict";
4 |
5 | return function( n, elem ) {
6 | var matched = [];
7 |
8 | for ( ; n; n = n.nextSibling ) {
9 | if ( n.nodeType === 1 && n !== elem ) {
10 | matched.push( n );
11 | }
12 | }
13 |
14 | return matched;
15 | };
16 |
17 | } );
18 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/ObjectFunctionString.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "./fnToString"
3 | ], function( fnToString ) {
4 | "use strict";
5 |
6 | return fnToString.call( Object );
7 | } );
8 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/arr.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | return [];
5 | } );
6 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/class2type.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | // [[Class]] -> type pairs
5 | return {};
6 | } );
7 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/concat.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "./arr"
3 | ], function( arr ) {
4 | "use strict";
5 |
6 | return arr.concat;
7 | } );
8 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/document.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | return window.document;
5 | } );
6 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/documentElement.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "./document"
3 | ], function( document ) {
4 | "use strict";
5 |
6 | return document.documentElement;
7 | } );
8 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/fnToString.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "./hasOwn"
3 | ], function( hasOwn ) {
4 | "use strict";
5 |
6 | return hasOwn.toString;
7 | } );
8 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/getProto.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | return Object.getPrototypeOf;
5 | } );
6 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/hasOwn.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "./class2type"
3 | ], function( class2type ) {
4 | "use strict";
5 |
6 | return class2type.hasOwnProperty;
7 | } );
8 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/indexOf.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "./arr"
3 | ], function( arr ) {
4 | "use strict";
5 |
6 | return arr.indexOf;
7 | } );
8 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/pnum.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | return ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
5 | } );
6 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/push.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "./arr"
3 | ], function( arr ) {
4 | "use strict";
5 |
6 | return arr.push;
7 | } );
8 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/rcssNum.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "../var/pnum"
3 | ], function( pnum ) {
4 |
5 | "use strict";
6 |
7 | return new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
8 |
9 | } );
10 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/rnothtmlwhite.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | // Only count HTML whitespace
5 | // Other whitespace should count in values
6 | // https://html.spec.whatwg.org/multipage/infrastructure.html#space-character
7 | return ( /[^\x20\t\r\n\f]+/g );
8 | } );
9 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/slice.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "./arr"
3 | ], function( arr ) {
4 | "use strict";
5 |
6 | return arr.slice;
7 | } );
8 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/support.js:
--------------------------------------------------------------------------------
1 | define( function() {
2 | "use strict";
3 |
4 | // All support tests are defined in their respective modules.
5 | return {};
6 | } );
7 |
--------------------------------------------------------------------------------
/web_app/public/lib/jquery/src/var/toString.js:
--------------------------------------------------------------------------------
1 | define( [
2 | "./class2type"
3 | ], function( class2type ) {
4 | "use strict";
5 |
6 | return class2type.toString;
7 | } );
8 |
--------------------------------------------------------------------------------
/web_app/src/config/dbconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "user": "sa",
3 | "password": "SqlDevOps2017",
4 | "server": "mssql",
5 | "database": "WideWorldImporters",
6 | "port": 1433,
7 | "options": {
8 | "encrypt": false
9 | }
10 | }
--------------------------------------------------------------------------------
/web_app/src/config/navconfig.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "url": "/",
4 | "name": "Dashboard"
5 | },
6 | {
7 | "url": "directory",
8 | "name": "Directory"
9 | },
10 | {
11 | "url": "/dbsize",
12 | "name": "Database Size"
13 | },
14 | {
15 | "url": "/tablespacedetail",
16 | "name": "Table Space Usage"
17 | },
18 | {
19 | "url": "/queryperf",
20 | "name": "Query Performance"
21 | },
22 | {
23 | "url": "/servermemorybydb",
24 | "name": "Memory Usage by Database"
25 | },
26 | {
27 | "url": "/users",
28 | "name": "Database Users"
29 | }
30 | ]
--------------------------------------------------------------------------------
/web_app/src/modules/sqldevops.js:
--------------------------------------------------------------------------------
1 | // ------------------------------------------------------------------------//
2 | // Description: Demo application source code
3 | // Repository: https://github.com/erickangMSFT
4 | // Author: Eric Kang
5 | // License: MIT
6 | // ------------------------------------------------------------------------//
7 |
8 | (()=> {
9 |
10 | module.exports ={
11 | getSqlError: getSqlError
12 | };
13 |
14 | function getSqlError(err) {
15 | const sqlError = {};
16 | sqlError.message = err.message;
17 | sqlError.status = 'mssql query execution error';
18 | sqlError.stack = err.stack;
19 | return sqlError;
20 | }
21 |
22 | })();
--------------------------------------------------------------------------------
/web_app/src/routes/API/diskusage.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/src/routes/API/diskusage.js
--------------------------------------------------------------------------------
/web_app/src/routes/API/topqueriesbyaveragecpu.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/erickangMSFT/sqldevops/abae86637b48f457c49a8c52495e5d05c27a8945/web_app/src/routes/API/topqueriesbyaveragecpu.js
--------------------------------------------------------------------------------
/web_app/src/sample/bug.js:
--------------------------------------------------------------------------------
1 | //Todo: bug fix
2 |
3 | // ps.prepare(data, (err)=>{
4 | // if(err){
5 | // console.log(err);
6 | // }
7 | // else{
8 | // //console.log(ps);
9 | // ps.execute((err,rec)=>{
10 |
11 | // if (err){
12 | // console.log(err);
13 | // }
14 | // else {
15 | // console.log('data fetched');
16 | // console.log(rec.recordset);
17 | // res.render('index', {
18 | // title: 'Dashboard',
19 | // tablespaces: rec.recordset
20 | // });
21 | // }
22 | // });
23 | // }
24 | // });
--------------------------------------------------------------------------------
/web_app/src/sample/preparedstatmentroute.js:
--------------------------------------------------------------------------------
1 | // 'use strict';
2 |
3 | // const express = require('express');
4 | // const router = express.Router();
5 | // const mssql = require('mssql');
6 |
7 | // /* GET home page. */
8 | // router.get('/', (req, res, next)=> {
9 | // const ps = new mssql.PreparedStatement();
10 | // ps.input('id', mssql.Int);
11 | // ps.prepare('myquery where id = @id', (err)=>{
12 | // ps.execute({id:req.params.id}, (err,rec)=>{
13 | // res.render('index', {
14 | // title: 'Express',
15 | // tablespaces: rec.recordset
16 | // });
17 | // });
18 | // });
19 |
20 | // });
21 | // module.exports = router;
22 |
--------------------------------------------------------------------------------
/web_app/src/sql/backuphistory.sql:
--------------------------------------------------------------------------------
1 | SELECT
2 | DB.name AS [database],
3 | CASE
4 | WHEN BK.[type] = 'D' THEN 'FULL'
5 | WHEN BK.[type] = 'I' THEN 'DIFF'
6 | WHEN BK.[type] = 'L' THEN 'LOG'
7 | WHEN BK.[type] = 'F' THEN 'FILEGROUP'
8 | WHEN BK.[type] = 'G' THEN 'DIFFERENTIAL - FILE'
9 | WHEN BK.[type] = 'P' THEN 'PARTIAL'
10 | WHEN BK.[type] = 'Q' THEN 'DIFFERENTIAL PARTIAL'
11 | END AS [backup_type],
12 | MAX(BK.backup_start_date) AS [last_backup]
13 | FROM master..sysdatabases AS DB
14 | LEFT JOIN msdb..backupset AS BK ON DB.name = BK.database_name
15 | LEFT JOIN msdb..backupmediafamily AS MD ON BK.media_set_id = MD.media_set_id
16 | GROUP BY DB.name, BK.[type]
17 | ORDER BY MAX(BK.backup_start_date) DESC, DB.name;
--------------------------------------------------------------------------------
/web_app/src/sql/customers_wwi.sql:
--------------------------------------------------------------------------------
1 | SELECT
2 | p.PersonID,
3 | p.FullName,
4 | p.PhoneNumber,
5 | p.FaxNumber,
6 | p.EmailAddress,
7 | p.LogonName
8 | FROM Application.People p
--------------------------------------------------------------------------------
/web_app/src/sql/db_size.sql:
--------------------------------------------------------------------------------
1 | with fs
2 | as
3 | (
4 | select database_id, type, size * 8.0 / 1024 size
5 | from sys.master_files
6 | )
7 | select
8 | name,
9 | (select sum(size) from fs where type = 0 and fs.database_id = db.database_id) data_file,
10 | (select sum(size) from fs where type = 1 and fs.database_id = db.database_id) log_file
11 | from sys.databases db
12 | --where database_id > 4
--------------------------------------------------------------------------------
/web_app/src/sql/directory.sql:
--------------------------------------------------------------------------------
1 |
2 | select BusinessEntityID, FirstName, LastName, EmailAddress, PhoneNumber, JobTitle, DepartmentName
3 | from humanresources.vemployee
4 |
--------------------------------------------------------------------------------
/web_app/src/sql/users.sql:
--------------------------------------------------------------------------------
1 | DECLARE @SQLStatement VARCHAR(4000)
2 | DECLARE @T_DBuser TABLE (DBName SYSNAME, UserName SYSNAME, AssociatedDBRole NVARCHAR(256))
3 | SET @SQLStatement='
4 | SELECT ''?'' AS DBName,dp.name AS UserName,USER_NAME(drm.role_principal_id) AS AssociatedDBRole
5 | FROM ?.sys.database_principals dp
6 | LEFT OUTER JOIN ?.sys.database_role_members drm
7 | ON dp.principal_id=drm.member_principal_id
8 | WHERE dp.sid NOT IN (0x01) AND dp.sid IS NOT NULL AND dp.type NOT IN (''C'')
9 | AND dp.is_fixed_role <> 1 AND dp.name NOT LIKE ''##%'' AND ''?''
10 | NOT IN (''master'',''msdb'',''model'',''tempdb'') ORDER BY DBName'
11 | INSERT @T_DBuser
12 | EXEC sp_MSforeachdb @SQLStatement
13 | SELECT * FROM @T_DBuser ORDER BY DBName
--------------------------------------------------------------------------------
/web_app/vsts-docker-images.txt:
--------------------------------------------------------------------------------
1 | ericskang/webapp
--------------------------------------------------------------------------------