Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Test Driven Development with Chef

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
Avatar for Nic Grayson Nic Grayson
November 02, 2013

Test Driven Development with Chef

Overview of Chef basics and TTDing an ntp cookbook with chefspec and test-kitchen

Avatar for Nic Grayson

Nic Grayson

November 02, 2013
Tweet

Other Decks in Technology

Transcript

  1. WHY USE CHEF? Code as infrastructure Thick client, thin server

    Order of convergence matters Pure ruby not a DSL
  2. DEV OPS IS IMPORTANT Devs working with Ops = Success

    Continuous Delivery Personal Empowerment and Responsibility
  3. WORKSTATION Knife - command line tool Repo - contains version

    controlled information about your infrastructure Keys - allow access to chef server api
  4. INTEGRATION TESTS gem install test-kitchen –pre Uses Vagrant ( )

    Bats tests run on virtual machine http://vagrantup.com
  5. CREATE THE COOKBOOK $ k n i f e c

    o o k b o o k c r e a t e n t p $ g i t i n i t $ t r e e . ├ ─ ─ C H A N G E L O G . m d ├ ─ ─ R E A D M E . m d ├ ─ ─ a t t r i b u t e s ├ ─ ─ d e f i n i t i o n s ├ ─ ─ f i l e s │ └ ─ ─ d e f a u l t ├ ─ ─ l i b r a r i e s ├ ─ ─ m e t a d a t a . r b ├ ─ ─ p r o v i d e r s ├ ─ ─ r e c i p e s │ └ ─ ─ d e f a u l t . r b ├ ─ ─ r e s o u r c e s └ ─ ─ t e m p l a t e s └ ─ ─ d e f a u l t
  6. FILL OUT METADATA n a m e ' n t

    p ' m a i n t a i n e r ' N i c G r a y s o n ' m a i n t a i n e r _ e m a i l ' n i c . g r a y s o n @ b a n n o . c o m ' l i c e n s e ' A l l r i g h t s r e s e r v e d ' d e s c r i p t i o n ' I n s t a l l s / C o n f i g u r e s n t p ' l o n g _ d e s c r i p t i o n I O . r e a d ( F i l e . j o i n ( F i l e . d i r n a m e ( _ _ F I L E _ _ ) , ' R E A D M E . m d ' ) ) v e r s i o n ' 0 . 1 . 0 '
  7. WRITE SPEC TESTS r e q u i r e

    ' c h e f s p e c ' d e s c r i b e ' n t p : : d e f a u l t ' d o l e t ( : c h e f _ r u n ) { C h e f S p e c : : R u n n e r . n e w . c o n v e r g e ( ' n t p : : d e f a u l t ' ) } i t ' s h o u l d i n s t a l l t h e n t p p a c k a g e ' d o e x p e c t ( c h e f _ r u n ) . t o i n s t a l l _ p a c k a g e ( ' n t p ' ) e n d i t ' s h o u l d c r e a t e t h e t e m p l a t e f i l e f o r n t p ' d o e x p e c t ( c h e f _ r u n ) . t o c r e a t e _ t e m p l a t e ( ' / e t c / n t p . c o n f ' ) e n d i t ' s h o u l d n o t i f y n t p d t o r e s t a r t ' d o r e s o u r c e = c h e f _ r u n . t e m p l a t e ( ' / e t c / n t p . c o n f ' ) e x p e c t ( r e s o u r c e ) . t o n o t i f y ( ' s e r v i c e [ n t p ] ' ) . t o ( : r e s t a r t ) e n d e n d
  8. RUN THE TESTS $ b u n d l e

    e x e c r s p e c F F F F a i l u r e s : 1 ) n t p : : d e f a u l t s h o u l d i n s t a l l t h e n t p p a c k a g e F a i l u r e / E r r o r : e x p e c t ( c h e f _ r u n ) . t o i n s t a l l _ p a c k a g e ( ' n t p ' ) e x p e c t e d " p a c k a g e [ n t p ] w i t h " a c t i o n : i n s t a l l t o b e i n C h e f r u n . O t h e r p a c k a g e r e s o u r c e s : # . / s p e c / d e f a u l t _ s p e c . r b : 9 : i n ` b l o c k ( 2 l e v e l s ) i n < t o p ( r e q u i r e d ) > ' 2 ) n t p : : d e f a u l t s h o u l d c r e a t e t h e t e m p l a t e f i l e f o r n t p F a i l u r e / E r r o r : e x p e c t ( c h e f _ r u n ) . t o c r e a t e _ t e m p l a t e ( ' / e t c / n t p . c o n f ' ) e x p e c t e d " t e m p l a t e [ / e t c / n t p . c o n f ] w i t h " a c t i o n : c r e a t e t o b e i n C h e f r u n . O t h e r t e m p l a t e r e s o u r c e s : # . / s p e c / d e f a u l t _ s p e c . r b : 1 3 : i n ` b l o c k ( 2 l e v e l s ) i n < t o p ( r e q u i r e d ) > ' 3 ) n t p : : d e f a u l t s h o u l d n o t i f y n t p d t o r e s t a r t F a i l u r e / E r r o r : e x p e c t ( r e s o u r c e ) . t o n o t i f y ( ' s e r v i c e [ n t p ] ' ) . t o ( : r e s t a r t ) e x p e c t e d _ s o m e t h i n g _ t o n o t i f y " s e r v i c e [ n t p ] " w i t h a c t i o n : r e s t a r t , b u t t h e _ s o m e t h i n g _ y o u g a v e m e w a s n i l ! I f y o u a r e r u n n i n g a t e s t l i k e : e x p e c t ( _ s o m e t h i n g _ ) . t o n o t i f y ( ' . . . ' ) M a k e s u r e t h a t ` _ s o m e t h i n g _ ` e x i s t s , b e c a u s e I g o t n i l # . / s p e c / d e f a u l t _ s p e c . r b : 1 8 : i n ` b l o c k ( 2 l e v e l s ) i n < t o p ( r e q u i r e d ) > ' F i n i s h e d i n 0 . 1 2 4 5 9 s e c o n d s
  9. RUN TESTS AGAIN b u n d l e e

    x e c r s p e c . F F F a i l u r e s : 1 ) n t p : : d e f a u l t s h o u l d c r e a t e t h e t e m p l a t e f i l e f o r n t p F a i l u r e / E r r o r : e x p e c t ( c h e f _ r u n ) . t o c r e a t e _ t e m p l a t e ( ' / e t c / n t p . c o n f ' ) e x p e c t e d " t e m p l a t e [ / e t c / n t p . c o n f ] w i t h " a c t i o n : c r e a t e t o b e i n C h e f r u n . O t h e r t e m p l a t e r e s o u r c e s : # . / s p e c / d e f a u l t _ s p e c . r b : 1 3 : i n ` b l o c k ( 2 l e v e l s ) i n < t o p ( r e q u i r e d ) > ' 2 ) n t p : : d e f a u l t s h o u l d n o t i f y n t p d t o r e s t a r t F a i l u r e / E r r o r : e x p e c t ( r e s o u r c e ) . t o n o t i f y ( ' s e r v i c e [ n t p ] ' ) . t o ( : r e s t a r t ) e x p e c t e d _ s o m e t h i n g _ t o n o t i f y " s e r v i c e [ n t p ] " w i t h a c t i o n : r e s t a r t , b u t t h e _ s o m e t h i n g _ y o u g a v e m e w a s n i l ! I f y o u a r e r u n n i n g a t e s t l i k e : e x p e c t ( _ s o m e t h i n g _ ) . t o n o t i f y ( ' . . . ' ) M a k e s u r e t h a t ` _ s o m e t h i n g _ ` e x i s t s , b e c a u s e I g o t n i l # . / s p e c / d e f a u l t _ s p e c . r b : 1 8 : i n ` b l o c k ( 2 l e v e l s ) i n < t o p ( r e q u i r e d ) > ' F i n i s h e d i n 0 . 1 2 6 5 7 s e c o n d s 3 e x a m p l e s , 2 f a i l u r e s F a i l e d e x a m p l e s : r s p e c . / s p e c / d e f a u l t _ s p e c . r b : 1 2 # n t p : : d e f a u l t s h o u l d c r e a t e t h e t e m p l a t e f i l
  10. FIX MORE TESTS p a c k a g e

    ' n t p ' t e m p l a t e ' / e t c / n t p . c o n f ' d o s o u r c e ' n t p . c o n f . e r b ' n o t i f i e s : r e s t a r t , ' s e r v i c e [ n t p ] ' e n d s e r v i c e ' n t p ' d o a c t i o n [ : e n a b l e , : s t a r t ] e n d
  11. RUN TESTS AGAIN b u n d l e e

    x e c r s p e c . . . F i n i s h e d i n 0 . 1 2 9 7 8 s e c o n d s 3 e x a m p l e s , 0 f a i l u r e s
  12. WRITE NEW TEST i t ' s h o u

    l d c r e a t e t h e t e m p l a t e f i l e f o r n t p ' d o e x p e c t ( c h e f _ r u n ) . t o c r e a t e _ t e m p l a t e ( ' / e t c / n t p . c o n f ' ) . w i t h _ c o n t e n t ( / s e r v e r ' 0 . p o o l . n t p . o r g ' / ) e n d
  13. RUN TESTS AGAIN b u n d l e e

    x e c r s p e c . F . F a i l u r e s : 1 ) n t p : : d e f a u l t s h o u l d c r e a t e t h e t e m p l a t e f i l e f o r n t p F a i l u r e / E r r o r : e x p e c t ( c h e f _ r u n ) . t o r e n d e r _ f i l e ( ' / e t c / n t p . c o n f ' ) . w i t h _ c o n t e n t ( / 0 . p o o l . n t p . o r g + / ) C h e f : : E x c e p t i o n s : : F i l e N o t F o u n d : C o o k b o o k ' n t p ' ( 0 . 1 . 0 ) d o e s n o t c o n t a i n a f i l e a t a n y o f t h e s e l o c a t i o n s : t e m p l a t e s / c h e f s p e c - 0 . 6 . 1 / n t p . c o n f . e r b t e m p l a t e s / c h e f s p e c / n t p . c o n f . e r b t e m p l a t e s / d e f a u l t / n t p . c o n f . e r b T h i s c o o k b o o k _ d o e s _ c o n t a i n : [ ' / U s e r s / n g r a y s o n / b a n n o / c o o k b o o k s / n t p / t e m p l a t e s / d e f a u l t / n t p . c o n f . e r b . b a k ' ] # . / s p e c / d e f a u l t _ s p e c . r b : 1 3 : i n ` b l o c k ( 2 l e v e l s ) i n < t o p ( r e q u i r e d ) > ' F i n i s h e d i n 0 . 1 2 9 3 8 s e c o n d s 3 e x a m p l e s , 1 f a i l u r e F a i l e d e x a m p l e s : r s p e c . / s p e c / d e f a u l t _ s p e c . r b : 1 2 # n t p : : d e f a u l t s h o u l d c r e a t e t h e t e m p l a t e f i l e f o r n t p
  14. FIX MORE TESTS templates/default/ntp.conf.erb # T h i s f

    i l e w a s g e n e r a t e d b y C h e f f o r ' < % = n o d e [ ' f q d n ' ] % > ' . # D o N O T e d i t t h i s f i l e b y h a n d ! r e s t r i c t d e f a u l t k o d n o m o d i f y n o t r a p n o p e e r n o q u e r y r e s t r i c t - 6 d e f a u l t k o d n o m o d i f y n o t r a p n o p e e r n o q u e r y r e s t r i c t 1 2 7 . 0 . 0 . 1 r e s t r i c t - 6 : : 1 s e r v e r ' 0 . p o o l . n t p . o r g ' s e r v e r 1 2 7 . 1 2 7 . 1 . 0 # l o c a l c l o c k d r i f t f i l e / v a r / l i b / n t p / d r i f t k e y s / e t c / n t p / k e y s
  15. RUN TESTS AGAIN b u n d l e e

    x e c r s p e c . . . F i n i s h e d i n 0 . 1 2 7 6 5 s e c o n d s 3 e x a m p l e s , 0 f a i l u r e s
  16. PREPARE TEST KITCHEN $ k i t c h e

    n i n i t c r e a t e . k i t c h e n . y m l c r e a t e t e s t / i n t e g r a t i o n / d e f a u l t c r e a t e . g i t i g n o r e a p p e n d . g i t i g n o r e a p p e n d . g i t i g n o r e a p p e n d G e m f i l e a p p e n d G e m f i l e
  17. .KITCHEN.YML FILE - - - d r i v e

    r _ p l u g i n : v a g r a n t d r i v e r _ c o n f i g : r e q u i r e _ c h e f _ o m n i b u s : t r u e p l a t f o r m s : - n a m e : u b u n t u - 1 2 . 0 4 d r i v e r _ c o n f i g : b o x : o p s c o d e - u b u n t u - 1 2 . 0 4 b o x _ u r l : h t t p s : / / o p s c o d e - v m - b e n t o . s 3 . a m a z o n a w s . c o m / v a g r a n t / o p s c o d e _ u b u n t u - 1 2 . 0 4 _ p r o v i s i o n e r l e s s . b o x - n a m e : u b u n t u - 1 0 . 0 4 d r i v e r _ c o n f i g : b o x : o p s c o d e - u b u n t u - 1 0 . 0 4 b o x _ u r l : h t t p s : / / o p s c o d e - v m - b e n t o . s 3 . a m a z o n a w s . c o m / v a g r a n t / o p s c o d e _ u b u n t u - 1 0 . 0 4 _ p r o v i s i o n e r l e s s . b o x - n a m e : c e n t o s - 6 . 4 d r i v e r _ c o n f i g : b o x : o p s c o d e - c e n t o s - 6 . 4 b o x _ u r l : h t t p s : / / o p s c o d e - v m - b e n t o . s 3 . a m a z o n a w s . c o m / v a g r a n t / o p s c o d e _ c e n t o s - 6 . 4 _ p r o v i s i o n e r l e s s . b o x - n a m e : c e n t o s - 5 . 9 d r i v e r _ c o n f i g : b o x : o p s c o d e - c e n t o s - 5 . 9 b o x _ u r l : h t t p s : / / o p s c o d e - v m - b e n t o . s 3 . a m a z o n a w s . c o m / v a g r a n t / o p s c o d e _ c e n t o s - 5 . 9 _ p r o v i s i o n e r l e s s . b o x s u i t e s : - n a m e : d e f a u l t r u n _ l i s t : [ " r e c i p e [ n t p ] " ] a t t r i b u t e s : { }
  18. START UP TEST KITCHEN $ k i t c h

    e n c o n v e r g e
  19. ADD BATS TESTS test/integration/default/ntp.bats # ! / u s r

    / b i n / e n v b a t s @ t e s t " n t p d s h o u l d b e r u n n i n g " { r u n / e t c / i n i t . d / n t p d s t a t u s [ " $ o u t p u t " = " * N T P s e r v e r i s r u n n i n g " ] }
  20. RUN BATS TESTS $ k i t c h e

    n v e r i f y - - - - - > S t a r t i n g K i t c h e n ( v 1 . 0 . 0 . b e t a . 3 ) - - - - - > S e t t i n g u p < d e f a u l t - u b u n t u - 1 2 0 4 > F i n i s h e d s e t t i n g u p < d e f a u l t - u b u n t u - 1 2 0 4 > ( 0 m 0 . 0 0 s ) . - - - - - > V e r i f y i n g < d e f a u l t - u b u n t u - 1 2 0 4 > F i n i s h e d v e r i f y i n g < d e f a u l t - u b u n t u - 1 2 0 4 > ( 0 m 0 . 0 0 s ) . - - - - - > K i t c h e n i s f i n i s h e d . ( 0 m 0 . 3 7 s )