├── .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 | Artboard 6 -------------------------------------------------------------------------------- /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 --------------------------------------------------------------------------------