SlideShare uma empresa Scribd logo
1 de 58
Baixar para ler offline
Hart Hoover
Making Test-Driven Development
[Somewhat] Bearable on OpenStack
@hhoover
#rackstackatl
#rackstackatl
RACKSPACE VISION
To be recognized as 

one of the world’s great 

service companies.
#rackstackatl
WELL TESTED = GOOD SERVICE
#rackstackatl
TEST-DRIVEN DEVELOPMENT (TRADITIONAL)
Test-driven development is a software development process that relies
on the repetition of a very short development cycle.
First the developer writes an (initially failing) automated test case that
defines a desired improvement or new function,
then produces the minimum amount of code to pass that test,
then finally refactors the new code to acceptable standards.
#rackstackatl
PLAN CODE BUILD TEST RELEASE DEPLOY OPS
THIS IS NOT TDD
THIS IS NOT “DEVOPS”
#rackstackatl
PLAN CODE BUILD TEST RELEASE DEPLOY OPS
TEST
THAT’S A BIT BETTER
(STILL NOT “DEVOPS”)
#rackstackatl
TESTING IS A GOOD IDEA
FIND MISTAKES
BEFORE
THEY HAPPEN
#rackstackatl
TESTING IS A GOOD IDEA
YOUR TEAM
WON’T HATE
YOU
#rackstackatl
TESTING IS A GOOD IDEA
YOUR
CUSTOMERS
WON’T HATE
YOU
#rackstackatl
THE PROBLEM…
#rackstackatl
Object Placeholder
HERO CULTURE
#rackstackatl
LAZINESS OR ARROGANCE
“I just want to write code, not tests.”
“My code works when I push it.”
“It works on my machine.”
“QA does the tests.”
#rackstackatl
LEADERSHIP PRESSURE
#rackstackatl
TIME IS MONEY
DEV TIME IS A LOT OF
MONEY
&
#rackstackatl
ONE SOLUTION:
BE THE CHANGE YOU WANT
TO SEE IN THE WORLD
#rackstackatl
ANOTHER SOLUTION:
CONTINUOUS TESTING
#rackstackatl
TOOLS OF THE TRADE…
#rackstackatl
http://hart.io
#rackstackatl
#rackstackatl
#rackstackatl
#rackstackatl
DEPLOY A CHEF SERVER WITH HEAT
https://github.com/rackspace-orchestration-templates/chef-server
#rackstackatl
CHEF DEVELOPMENT KIT
http://www.getchef.com/downloads/chef-dk/
#rackstackatl
chef
CHEF DEVELOPMENT KIT: CLI TOOLS
knife
chef-­‐client
Chef Zero
Ohai
#rackstackatl
CHEF DEVELOPMENT KIT
#rackstackatl
CHEF DEVELOPMENT KIT - BERKSHELF
source	
  ‘https://api.berkshelf.com'	
  
metadata	
  
!
cookbook	
  ‘apt’,	
  ‘~>	
  2.0’	
  
cookbook	
  ‘minitest-­‐handler’	
  
cookbook	
  ‘yum’,	
  ‘~>	
  2.0’	
  
cookbook	
  ‘build-­‐essential’,	
  github:	
  ‘opscode-­‐cookbooks/build-­‐essential’	
  
cookbook	
  ‘mysql_test’,	
  :path	
  =>	
  ‘test/cookbooks/mysql_test’
#rackstackatl
CHEF DEVELOPMENT KIT - BERKSHELF
source	
  ‘https://api.berkshelf.com'	
  
metadata	
  
!
cookbook	
  ‘apt’,	
  ‘~>	
  2.0’	
  
cookbook	
  ‘minitest-­‐handler’	
  
cookbook	
  ‘yum’,	
  ‘~>	
  2.0’	
  
cookbook	
  ‘build-­‐essential’,	
  github:	
  ‘opscode-­‐cookbooks/build-­‐essential’	
  
cookbook	
  ‘mysql_test’,	
  :path	
  =>	
  ‘test/cookbooks/mysql_test’
#rackstackatl
CHEF DEVELOPMENT KIT - BERKSHELF
source	
  ‘https://api.berkshelf.com'	
  
metadata	
  
!
cookbook	
  ‘apt’,	
  ‘~>	
  2.0’	
  
cookbook	
  ‘minitest-­‐handler’	
  
cookbook	
  ‘yum’,	
  ‘~>	
  2.0’	
  
cookbook	
  ‘build-­‐essential’,	
  github:	
  ‘opscode-­‐cookbooks/build-­‐essential’	
  
cookbook	
  ‘mysql_test’,	
  :path	
  =>	
  ‘test/cookbooks/mysql_test’
#rackstackatl
CHEF DEVELOPMENT KIT - BERKSHELF
source	
  ‘https://api.berkshelf.com'	
  
metadata	
  
!
cookbook	
  ‘apt’,	
  ‘~>	
  2.0’	
  
cookbook	
  ‘minitest-­‐handler’	
  
cookbook	
  ‘yum’,	
  ‘~>	
  2.0’	
  
cookbook	
  ‘build-­‐essential’,	
  github:	
  ‘opscode-­‐cookbooks/build-­‐essential’	
  
cookbook	
  ‘mysql_test’,	
  :path	
  =>	
  ‘test/cookbooks/mysql_test’
#rackstackatl
CHEF DEVELOPMENT KIT - BERKSHELF
source	
  ‘https://api.berkshelf.com'	
  
metadata	
  
!
cookbook	
  ‘apt’,	
  ‘~>	
  2.0’	
  
cookbook	
  ‘minitest-­‐handler’	
  
cookbook	
  ‘yum’,	
  ‘~>	
  2.0’	
  
cookbook	
  ‘build-­‐essential’,	
  github:	
  ‘opscode-­‐cookbooks/build-­‐essential’	
  
cookbook	
  ‘mysql_test’,	
  :path	
  =>	
  ‘test/cookbooks/mysql_test’
#rackstackatl
kitchen.ci/docs/guide
CHEF DEVELOPMENT KIT
Test Kitchen
#rackstackatl
-­‐-­‐-­‐	
  
provisioner:	
  
	
  	
  name:	
  chef_solo	
  
!
platforms:	
  
	
  	
  -­‐	
  name:	
  ubuntu-­‐14.04	
  
!
driver:	
  
	
  	
  name:	
  rackspace	
  
	
  	
  rackspace_region:	
  IAD	
  
	
  	
  server_name:	
  rackspace-­‐ubuntu1404	
  
	
  	
  image_id:	
  bb02b1a3-­‐bc77-­‐4d17-­‐ab5b-­‐421d89850fca	
  
	
  	
  flavor_id:	
  performance1-­‐1	
  
	
  	
  require_chef_omnibus:	
  latest	
  
!
suites:	
  
	
  	
  -­‐	
  name:	
  default	
  
	
  	
  	
  	
  run_list:	
  recipe[cookbook::default]	
  
	
  	
  	
  	
  attributes:
#rackstackatl
-­‐-­‐-­‐	
  
provisioner:	
  
	
  	
  name:	
  chef_solo	
  
!
platforms:	
  
	
  	
  -­‐	
  name:	
  ubuntu-­‐14.04	
  
!
driver:	
  
	
  	
  name:	
  rackspace	
  
	
  	
  rackspace_region:	
  IAD	
  
	
  	
  server_name:	
  rackspace-­‐ubuntu1404	
  
	
  	
  image_id:	
  bb02b1a3-­‐bc77-­‐4d17-­‐ab5b-­‐421d89850fca	
  
	
  	
  flavor_id:	
  performance1-­‐1	
  
	
  	
  require_chef_omnibus:	
  latest	
  
!
suites:	
  
	
  	
  -­‐	
  name:	
  default	
  
	
  	
  	
  	
  run_list:	
  recipe[cookbook::default]	
  
	
  	
  	
  	
  attributes:
#rackstackatl
-­‐-­‐-­‐	
  
provisioner:	
  
	
  	
  name:	
  chef_solo	
  
!
platforms:	
  
	
  	
  -­‐	
  name:	
  ubuntu-­‐14.04	
  
!
driver:	
  
	
  	
  name:	
  rackspace	
  
	
  	
  rackspace_region:	
  IAD	
  
	
  	
  server_name:	
  rackspace-­‐ubuntu1404	
  
	
  	
  image_id:	
  bb02b1a3-­‐bc77-­‐4d17-­‐ab5b-­‐421d89850fca	
  
	
  	
  flavor_id:	
  performance1-­‐1	
  
	
  	
  require_chef_omnibus:	
  latest	
  
!
suites:	
  
	
  	
  -­‐	
  name:	
  default	
  
	
  	
  	
  	
  run_list:	
  recipe[cookbook::default]	
  
	
  	
  	
  	
  attributes:
#rackstackatl
-­‐-­‐-­‐	
  
provisioner:	
  
	
  	
  name:	
  chef_solo	
  
!
platforms:	
  
	
  	
  -­‐	
  name:	
  ubuntu-­‐14.04	
  
!
driver:	
  
	
  	
  name:	
  rackspace	
  
	
  	
  rackspace_region:	
  IAD	
  
	
  	
  server_name:	
  rackspace-­‐ubuntu1404	
  
	
  	
  image_id:	
  bb02b1a3-­‐bc77-­‐4d17-­‐ab5b-­‐421d89850fca	
  
	
  	
  flavor_id:	
  performance1-­‐1	
  
	
  	
  require_chef_omnibus:	
  latest	
  
!
suites:	
  
	
  	
  -­‐	
  name:	
  default	
  
	
  	
  	
  	
  run_list:	
  recipe[cookbook::default]	
  
	
  	
  	
  	
  attributes:
#rackstackatl
-­‐-­‐-­‐	
  
provisioner:	
  
	
  	
  name:	
  chef_solo	
  
!
platforms:	
  
	
  	
  -­‐	
  name:	
  ubuntu-­‐14.04	
  
!
driver:	
  
	
  	
  name:	
  rackspace	
  
	
  	
  rackspace_region:	
  IAD	
  
	
  	
  server_name:	
  rackspace-­‐ubuntu1404	
  
	
  	
  image_id:	
  bb02b1a3-­‐bc77-­‐4d17-­‐ab5b-­‐421d89850fca	
  
	
  	
  flavor_id:	
  performance1-­‐1	
  
	
  	
  require_chef_omnibus:	
  latest	
  
!
suites:	
  
	
  	
  -­‐	
  name:	
  default	
  
	
  	
  	
  	
  run_list:	
  recipe[cookbook::default]	
  
	
  	
  	
  	
  attributes:
#rackstackatl
CHEF DEVELOPMENT KIT
#rackstackatl
CHEF DEVELOPMENT KIT
ChefSpec
• Built on RSpec
• Converges a Chef run in memory
• Overrides all providers to take no action
• Mock Ohai data with Fauxhai
#rackstackatl
CHEF DEVELOPMENT KIT: CHEFSPEC
https://github.com/sethvargo/chefspec/tree/master/examples
#rackstackatl
CHEF DEVELOPMENT KIT: CHEFSPEC
require	
  'chefspec'	
  
!
describe	
  'apt_package::install'	
  do	
  
	
  	
  let(:chef_run)	
  {	
  ChefSpec::Runner.new.converge(described_recipe)	
  }	
  
!
	
  	
  it	
  'installs	
  a	
  apt_package	
  with	
  the	
  default	
  action'	
  do	
  
	
  	
  	
  	
  expect(chef_run).to	
  install_apt_package('default_action')	
  
	
  	
  	
  	
  expect(chef_run).to_not	
  install_apt_package('not_default_action')	
  
	
  	
  end	
  
end
#rackstackatl
CHEF DEVELOPMENT KIT: CHEFSPEC
require	
  'chefspec'	
  
!
describe	
  'apt_package::install'	
  do	
  
	
  	
  let(:chef_run)	
  {	
  ChefSpec::Runner.new.converge(described_recipe)	
  }	
  
!
	
  	
  it	
  'installs	
  a	
  apt_package	
  with	
  the	
  default	
  action'	
  do	
  
	
  	
  	
  	
  expect(chef_run).to	
  install_apt_package('default_action')	
  
	
  	
  	
  	
  expect(chef_run).to_not	
  install_apt_package('not_default_action')	
  
	
  	
  end	
  
end
#rackstackatl
CHEF DEVELOPMENT KIT: CHEFSPEC
require	
  'chefspec'	
  
!
describe	
  'apt_package::install'	
  do	
  
	
  	
  let(:chef_run)	
  {	
  ChefSpec::Runner.new.converge(described_recipe)	
  }	
  
!
	
  	
  it	
  'installs	
  a	
  apt_package	
  with	
  the	
  default	
  action'	
  do	
  
	
  	
  	
  	
  expect(chef_run).to	
  install_apt_package('default_action')	
  
	
  	
  	
  	
  expect(chef_run).to_not	
  install_apt_package('not_default_action')	
  
	
  	
  end	
  
end
#rackstackatl
HONORABLE MENTIONS
#rackstackatl
SERVERSPEC
• Built on RSpec
• Uses SSH to test your servers’ state
#rackstackatl
SERVERSPEC
describe	
  package('httpd')	
  do	
  
	
  	
  it	
  {	
  should	
  be_installed	
  }	
  
end	
  
!
describe	
  service('httpd')	
  do	
  
	
  	
  it	
  {	
  should	
  be_enabled	
  	
  	
  }	
  
	
  	
  it	
  {	
  should	
  be_running	
  	
  	
  }	
  
end	
  
!
describe	
  port(80)	
  do	
  
	
  	
  it	
  {	
  should	
  be_listening	
  }	
  
end
#rackstackatl
meez
https://github.com/paulczar/meez
#rackstackatl
RUBOCOP: STYLE
RUBY STYLE GUIDE
• code layout
• strings
• syntax
• regex
• more
#rackstackatl
GUARD: TEST WHILE YOU WORK
#rackstackatl
#rackstackatl
source	
  'https://rubygems.org'	
  
!
gem	
  'berkshelf'	
  
gem	
  'chef'	
  
gem	
  'meez'	
  
gem	
  'guard'	
  
gem	
  'guard-­‐kitchen'	
  
gem	
  'rubocop'	
  
gem	
  'foodcritic'	
  
gem	
  'chefspec'	
  
gem	
  'test-­‐kitchen'	
  
gem	
  'kitchen-­‐rackspace'	
  
gem	
  'kitchen-­‐openstack'
#rackstackatl
GET TO THE OPENSTACK STUFF
#rackstackatl
source	
  'https://rubygems.org'	
  
!
gem	
  'berkshelf'	
  
gem	
  'chef'	
  
gem	
  'meez'	
  
gem	
  'guard'	
  
gem	
  'guard-­‐kitchen'	
  
gem	
  'rubocop'	
  
gem	
  'foodcritic'	
  
gem	
  'chefspec'	
  
gem	
  'test-­‐kitchen'	
  
gem	
  'kitchen-­‐rackspace'	
  
gem	
  'kitchen-­‐openstack'
#rackstackatl
DEMO TIME!
#rackstackatl54
#rackstackatl55
#rackstackatl
162.242.253.111
LET’S PLAY ON THE CLOUD
#rackstackatl
WE’RE HIRING
http://rackertalent.com
#rackstackatl
RACKSPACE® HOSTING | 5000 WALZEM ROAD | SAN ANTONIO, TX 78218
US SALES: 1-800-961-2888 | US SUPPORT: 1-800-961-4454 | WWW.RACKSPACE.COM
RACKSPACE® HOSTING | © RACKSPACE US, INC. | RACKSPACE® AND FANATICAL SUPPORT® ARE SERVICE MARKS OF RACKSPACE US, INC. REGISTERED IN THE UNITED STATES AND OTHER COUNTRIES. | WWW.RACKSPACE.COMRACKSPACE® HOSTING | © RACKSPACE US, INC. | RACKSPACE® AND FANATICAL SUPPORT® ARE SERVICE MARKS OF RACKSPACE US, INC. REGISTERED IN THE UNITED STATES AND OTHER COUNTRIES. | WWW.RACKSPACE.COM
Hart Hoover
@hhoover

Mais conteúdo relacionado

Mais procurados

Environments - Fundamentals Webinar Series Week 5
Environments - Fundamentals Webinar Series Week 5Environments - Fundamentals Webinar Series Week 5
Environments - Fundamentals Webinar Series Week 5
Chef
 

Mais procurados (20)

Chef training Day5
Chef training Day5Chef training Day5
Chef training Day5
 
Testing Your Automation Code (Docker Version)
Testing Your Automation Code (Docker Version)Testing Your Automation Code (Docker Version)
Testing Your Automation Code (Docker Version)
 
Lessons from Etsy: Avoiding Kitchen Nightmares - #ChefConf 2012
Lessons from Etsy: Avoiding Kitchen Nightmares - #ChefConf 2012Lessons from Etsy: Avoiding Kitchen Nightmares - #ChefConf 2012
Lessons from Etsy: Avoiding Kitchen Nightmares - #ChefConf 2012
 
Chef training - Day3
Chef training - Day3Chef training - Day3
Chef training - Day3
 
Cookbook testing with KitcenCI and Serverrspec
Cookbook testing with KitcenCI and ServerrspecCookbook testing with KitcenCI and Serverrspec
Cookbook testing with KitcenCI and Serverrspec
 
Chef basics - write infrastructure as code
Chef basics - write infrastructure as codeChef basics - write infrastructure as code
Chef basics - write infrastructure as code
 
Compliance Automation Workshop
Compliance Automation WorkshopCompliance Automation Workshop
Compliance Automation Workshop
 
Continuous infrastructure testing
Continuous infrastructure testingContinuous infrastructure testing
Continuous infrastructure testing
 
Common configuration with Data Bags - Fundamentals Webinar Series Part 4
Common configuration with Data Bags - Fundamentals Webinar Series Part 4Common configuration with Data Bags - Fundamentals Webinar Series Part 4
Common configuration with Data Bags - Fundamentals Webinar Series Part 4
 
Environments - Fundamentals Webinar Series Week 5
Environments - Fundamentals Webinar Series Week 5Environments - Fundamentals Webinar Series Week 5
Environments - Fundamentals Webinar Series Week 5
 
Chef for beginners module 4
Chef for beginners   module 4Chef for beginners   module 4
Chef for beginners module 4
 
Test Driven Development with Chef
Test Driven Development with ChefTest Driven Development with Chef
Test Driven Development with Chef
 
Chef 0.10 Overview
Chef 0.10 OverviewChef 0.10 Overview
Chef 0.10 Overview
 
Node setup, resource, and recipes - Fundamentals Webinar Series Part 2
Node setup, resource, and recipes - Fundamentals Webinar Series Part 2Node setup, resource, and recipes - Fundamentals Webinar Series Part 2
Node setup, resource, and recipes - Fundamentals Webinar Series Part 2
 
Node object and roles - Fundamentals Webinar Series Part 3
Node object and roles - Fundamentals Webinar Series Part 3Node object and roles - Fundamentals Webinar Series Part 3
Node object and roles - Fundamentals Webinar Series Part 3
 
Chef for beginners module 3
Chef for beginners   module 3Chef for beginners   module 3
Chef for beginners module 3
 
Lucene application
Lucene applicationLucene application
Lucene application
 
Test Driven Development with Puppet - PuppetConf 2014
Test Driven Development with Puppet - PuppetConf 2014Test Driven Development with Puppet - PuppetConf 2014
Test Driven Development with Puppet - PuppetConf 2014
 
Admins: Smoke Test Your Hadoop Cluster!
Admins: Smoke Test Your Hadoop Cluster!Admins: Smoke Test Your Hadoop Cluster!
Admins: Smoke Test Your Hadoop Cluster!
 
Community Cookbooks & further resources - Fundamentals Webinar Series Part 6
Community Cookbooks & further resources - Fundamentals Webinar Series Part 6Community Cookbooks & further resources - Fundamentals Webinar Series Part 6
Community Cookbooks & further resources - Fundamentals Webinar Series Part 6
 

Semelhante a Making TDD [Somewhat] Bearable on OpenStack

Semelhante a Making TDD [Somewhat] Bearable on OpenStack (20)

Cloud Automation with Opscode Chef
Cloud Automation with Opscode ChefCloud Automation with Opscode Chef
Cloud Automation with Opscode Chef
 
IT Automation with Chef
IT Automation with ChefIT Automation with Chef
IT Automation with Chef
 
Autotesting rails app
Autotesting rails appAutotesting rails app
Autotesting rails app
 
infra-as-code
infra-as-codeinfra-as-code
infra-as-code
 
Deploying OpenStack with Chef
Deploying OpenStack with ChefDeploying OpenStack with Chef
Deploying OpenStack with Chef
 
Docker for Ruby Developers
Docker for Ruby DevelopersDocker for Ruby Developers
Docker for Ruby Developers
 
DevOps Hackathon: Session 3 - Test Driven Infrastructure
DevOps Hackathon: Session 3 - Test Driven InfrastructureDevOps Hackathon: Session 3 - Test Driven Infrastructure
DevOps Hackathon: Session 3 - Test Driven Infrastructure
 
Antons Kranga Building Agile Infrastructures
Antons Kranga   Building Agile InfrastructuresAntons Kranga   Building Agile Infrastructures
Antons Kranga Building Agile Infrastructures
 
Test Kitchen and Infrastructure as Code
Test Kitchen and Infrastructure as CodeTest Kitchen and Infrastructure as Code
Test Kitchen and Infrastructure as Code
 
Continuous Delivery: The Next Frontier
Continuous Delivery: The Next FrontierContinuous Delivery: The Next Frontier
Continuous Delivery: The Next Frontier
 
Chef advance
Chef advanceChef advance
Chef advance
 
Chef advance
Chef advanceChef advance
Chef advance
 
London Community Summit 2016 - Fresh New Chef Stuff
London Community Summit 2016 - Fresh New Chef StuffLondon Community Summit 2016 - Fresh New Chef Stuff
London Community Summit 2016 - Fresh New Chef Stuff
 
Introduction to Chef
Introduction to ChefIntroduction to Chef
Introduction to Chef
 
Linecook - A Chef Alternative
Linecook - A Chef AlternativeLinecook - A Chef Alternative
Linecook - A Chef Alternative
 
Instrumentación de entrega continua con Gitlab
Instrumentación de entrega continua con GitlabInstrumentación de entrega continua con Gitlab
Instrumentación de entrega continua con Gitlab
 
Installing and updating software packages [autosaved]
Installing and updating software packages [autosaved]Installing and updating software packages [autosaved]
Installing and updating software packages [autosaved]
 
DevOps hackathon Session 2: Basics of Chef
DevOps hackathon Session 2: Basics of ChefDevOps hackathon Session 2: Basics of Chef
DevOps hackathon Session 2: Basics of Chef
 
Cook Infrastructure with chef -- Justeat.IN
Cook Infrastructure with chef  -- Justeat.INCook Infrastructure with chef  -- Justeat.IN
Cook Infrastructure with chef -- Justeat.IN
 
Does your configuration code smell?
Does your configuration code smell?Does your configuration code smell?
Does your configuration code smell?
 

Mais de Hart Hoover

Mais de Hart Hoover (11)

CI/CD with Kubernetes
CI/CD with KubernetesCI/CD with Kubernetes
CI/CD with Kubernetes
 
CI/CD with Docker on AWS
CI/CD with Docker on AWSCI/CD with Docker on AWS
CI/CD with Docker on AWS
 
Ignite Talk: "Building a DevOps Community" / DevOps Days Austin 2015
Ignite Talk: "Building a DevOps Community" / DevOps Days Austin 2015Ignite Talk: "Building a DevOps Community" / DevOps Days Austin 2015
Ignite Talk: "Building a DevOps Community" / DevOps Days Austin 2015
 
San Antonio DevOps: Fluentd
San Antonio DevOps: FluentdSan Antonio DevOps: Fluentd
San Antonio DevOps: Fluentd
 
San Antonio Chef Users Meetup, Jun 2014 - Chef Metal
San Antonio Chef Users Meetup, Jun 2014 - Chef MetalSan Antonio Chef Users Meetup, Jun 2014 - Chef Metal
San Antonio Chef Users Meetup, Jun 2014 - Chef Metal
 
Deploying a Chef Server
Deploying a Chef ServerDeploying a Chef Server
Deploying a Chef Server
 
Rapid Chef Development with Berkshelf, Test-Kitchen and Foodcritic
Rapid Chef Development with Berkshelf, Test-Kitchen and FoodcriticRapid Chef Development with Berkshelf, Test-Kitchen and Foodcritic
Rapid Chef Development with Berkshelf, Test-Kitchen and Foodcritic
 
Vagrant Intro
Vagrant IntroVagrant Intro
Vagrant Intro
 
"Unlocked: The Hybrid Cloud" Business Track
"Unlocked: The Hybrid Cloud" Business Track"Unlocked: The Hybrid Cloud" Business Track
"Unlocked: The Hybrid Cloud" Business Track
 
Isolated Networks in the Cloud
Isolated Networks in the CloudIsolated Networks in the Cloud
Isolated Networks in the Cloud
 
Why Open Matters
Why Open MattersWhy Open Matters
Why Open Matters
 

Último

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Último (20)

Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 

Making TDD [Somewhat] Bearable on OpenStack