Introduction

On parle beaucoup de Terraform comme étant “la télécommande” du DevOps, celui-ci possède des chiffres assez conséquents : 2626 providers et 11397 modules.

Remarque

Un module est une intégration de Terraform avec un outil externe. On peut lancer un playbook, créer une instance sous AWS, ou même envoyer un message sur Slack.

J’utilise activement Terraform dans mes déploiements (création et/ou peuplement d’une VM sous Proxmox/LibVirt), mais depuis que mon infrastructure est basée sous Kubernetes, je me demande de la place que Terraform occupe dans mes déploiements. (Hors première installation du cluster)

Je me suis donc intéressé à Terraform et Kubernetes ensembles.

Les avantages de Kubernetes et Terraform ?

Kubernetes fonctionne bien sans Terraform, pourquoi commencer à rajouter des outils dans l’équation ?

Kubernetes souffre d’un grand mal : le YAML. Et même si j’adore le YAML (Vraiment, je veux pas retourner sur du JSON…) : celui-ci reste un simple format et non un réel langage de programmation.

C’est pourquoi le HCL peut potentiellement nous ouvrir des portes en proposant des intégrations à d’autres providers.

Un petit exemple en amuse-bouche

Une configmap en YAML

Si jamais je souhaite créer une configmap contenant un YAML pour une application. Voici le fichier que je souhaite stocker :

twitter=thebidouilleur
jobs=developper
favorite.meal=rougail
vehicule=electricunicycle

On peut créer notre fichier YAML avec la bonne entête, et indenter le contenu de notre fichier pour que YAML le reconnaisse comme un block de texte.

apiVersion: v1
kind: ConfigMap
metadata:
  name: data-user
  namespace: hcl
data:
  data.ini: |
    twitter=thebidouilleur
    jobs=developper
    favorite.meal=rougail
    vehicule=electricunicycle    

Facile, non?

Et maintenant on tente la même chose avec ce fichier ?
{
  "pokemon": [{
    "id": 1,
    "num": "001",
    "name": "Bulbasaur",
    "img": "http://www.serebii.net/pokemongo/pokemon/001.png",
    "type": [
      "Grass",
      "Poison"
    ],
    "height": "0.71 m",
    "weight": "6.9 kg",
    "candy": "Bulbasaur Candy",
    "candy_count": 25,
    "egg": "2 km",
    "spawn_chance": 0.69,
    "avg_spawns": 69,
    "spawn_time": "20:00",
    "multipliers": [1.58],
    "weaknesses": [
      "Fire",
      "Ice",
      "Flying",
      "Psychic"
    ],
    "next_evolution": [{
      "num": "002",
      "name": "Ivysaur"
    }, {
      "num": "003",
      "name": "Venusaur"
    }]
  }, {
    "id": 2,
    "num": "002",
    "name": "Ivysaur",
    "img": "http://www.serebii.net/pokemongo/pokemon/002.png",
    "type": [
      "Grass",
      "Poison"
    ],
    "height": "0.99 m",
    "weight": "13.0 kg",
    "candy": "Bulbasaur Candy",
    "candy_count": 100,
    "egg": "Not in Eggs",
    "spawn_chance": 0.042,
    "avg_spawns": 4.2,
    "spawn_time": "07:00",
    "multipliers": [
      1.2,
      1.6
    ],
    "weaknesses": [
      "Fire",
      "Ice",
      "Flying",
      "Psychic"
    ],
    "prev_evolution": [{
      "num": "001",
      "name": "Bulbasaur"
    }],
    "next_evolution": [{
      "num": "003",
      "name": "Venusaur"
    }]
  }, {
    "id": 3,
    "num": "003",
    "name": "Venusaur",
    "img": "http://www.serebii.net/pokemongo/pokemon/003.png",
    "type": [
      "Grass",
      "Poison"
    ],
    "height": "2.01 m",
    "weight": "100.0 kg",
    "candy": "Bulbasaur Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.017,
    "avg_spawns": 1.7,
    "spawn_time": "11:30",
    "multipliers": null,
    "weaknesses": [
      "Fire",
      "Ice",
      "Flying",
      "Psychic"
    ],
    "prev_evolution": [{
      "num": "001",
      "name": "Bulbasaur"
    }, {
      "num": "002",
      "name": "Ivysaur"
    }]
  }, {
    "id": 4,
    "num": "004",
    "name": "Charmander",
    "img": "http://www.serebii.net/pokemongo/pokemon/004.png",
    "type": [
      "Fire"
    ],
    "height": "0.61 m",
    "weight": "8.5 kg",
    "candy": "Charmander Candy",
    "candy_count": 25,
    "egg": "2 km",
    "spawn_chance": 0.253,
    "avg_spawns": 25.3,
    "spawn_time": "08:45",
    "multipliers": [1.65],
    "weaknesses": [
      "Water",
      "Ground",
      "Rock"
    ],
    "next_evolution": [{
      "num": "005",
      "name": "Charmeleon"
    }, {
      "num": "006",
      "name": "Charizard"
    }]
  }, {
    "id": 5,
    "num": "005",
    "name": "Charmeleon",
    "img": "http://www.serebii.net/pokemongo/pokemon/005.png",
    "type": [
      "Fire"
    ],
    "height": "1.09 m",
    "weight": "19.0 kg",
    "candy": "Charmander Candy",
    "candy_count": 100,
    "egg": "Not in Eggs",
    "spawn_chance": 0.012,
    "avg_spawns": 1.2,
    "spawn_time": "19:00",
    "multipliers": [1.79],
    "weaknesses": [
      "Water",
      "Ground",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "004",
      "name": "Charmander"
    }],
    "next_evolution": [{
      "num": "006",
      "name": "Charizard"
    }]
  }, {
    "id": 6,
    "num": "006",
    "name": "Charizard",
    "img": "http://www.serebii.net/pokemongo/pokemon/006.png",
    "type": [
      "Fire",
      "Flying"
    ],
    "height": "1.70 m",
    "weight": "90.5 kg",
    "candy": "Charmander Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.0031,
    "avg_spawns": 0.31,
    "spawn_time": "13:34",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Electric",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "004",
      "name": "Charmander"
    }, {
      "num": "005",
      "name": "Charmeleon"
    }]
  }, {
    "id": 7,
    "num": "007",
    "name": "Squirtle",
    "img": "http://www.serebii.net/pokemongo/pokemon/007.png",
    "type": [
      "Water"
    ],
    "height": "0.51 m",
    "weight": "9.0 kg",
    "candy": "Squirtle Candy",
    "candy_count": 25,
    "egg": "2 km",
    "spawn_chance": 0.58,
    "avg_spawns": 58,
    "spawn_time": "04:25",
    "multipliers": [2.1],
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "next_evolution": [{
      "num": "008",
      "name": "Wartortle"
    }, {
      "num": "009",
      "name": "Blastoise"
    }]
  }, {
    "id": 8,
    "num": "008",
    "name": "Wartortle",
    "img": "http://www.serebii.net/pokemongo/pokemon/008.png",
    "type": [
      "Water"
    ],
    "height": "0.99 m",
    "weight": "22.5 kg",
    "candy": "Squirtle Candy",
    "candy_count": 100,
    "egg": "Not in Eggs",
    "spawn_chance": 0.034,
    "avg_spawns": 3.4,
    "spawn_time": "07:02",
    "multipliers": [1.4],
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "prev_evolution": [{
      "num": "007",
      "name": "Squirtle"
    }],
    "next_evolution": [{
      "num": "009",
      "name": "Blastoise"
    }]
  }, {
    "id": 9,
    "num": "009",
    "name": "Blastoise",
    "img": "http://www.serebii.net/pokemongo/pokemon/009.png",
    "type": [
      "Water"
    ],
    "height": "1.60 m",
    "weight": "85.5 kg",
    "candy": "Squirtle Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.0067,
    "avg_spawns": 0.67,
    "spawn_time": "00:06",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "prev_evolution": [{
      "num": "007",
      "name": "Squirtle"
    }, {
      "num": "008",
      "name": "Wartortle"
    }]
  }, {
    "id": 10,
    "num": "010",
    "name": "Caterpie",
    "img": "http://www.serebii.net/pokemongo/pokemon/010.png",
    "type": [
      "Bug"
    ],
    "height": "0.30 m",
    "weight": "2.9 kg",
    "candy": "Caterpie Candy",
    "candy_count": 12,
    "egg": "2 km",
    "spawn_chance": 3.032,
    "avg_spawns": 303.2,
    "spawn_time": "16:35",
    "multipliers": [1.05],
    "weaknesses": [
      "Fire",
      "Flying",
      "Rock"
    ],
    "next_evolution": [{
      "num": "011",
      "name": "Metapod"
    }, {
      "num": "012",
      "name": "Butterfree"
    }]
  }, {
    "id": 11,
    "num": "011",
    "name": "Metapod",
    "img": "http://www.serebii.net/pokemongo/pokemon/011.png",
    "type": [
      "Bug"
    ],
    "height": "0.71 m",
    "weight": "9.9 kg",
    "candy": "Caterpie Candy",
    "candy_count": 50,
    "egg": "Not in Eggs",
    "spawn_chance": 0.187,
    "avg_spawns": 18.7,
    "spawn_time": "02:11",
    "multipliers": [
      3.55,
      3.79
    ],
    "weaknesses": [
      "Fire",
      "Flying",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "010",
      "name": "Caterpie"
    }],
    "next_evolution": [{
      "num": "012",
      "name": "Butterfree"
    }]
  }, {
    "id": 12,
    "num": "012",
    "name": "Butterfree",
    "img": "http://www.serebii.net/pokemongo/pokemon/012.png",
    "type": [
      "Bug",
      "Flying"
    ],
    "height": "1.09 m",
    "weight": "32.0 kg",
    "candy": "Caterpie Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.022,
    "avg_spawns": 2.2,
    "spawn_time": "05:23",
    "multipliers": null,
    "weaknesses": [
      "Fire",
      "Electric",
      "Ice",
      "Flying",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "010",
      "name": "Caterpie"
    }, {
      "num": "011",
      "name": "Metapod"
    }]
  }, {
    "id": 13,
    "num": "013",
    "name": "Weedle",
    "img": "http://www.serebii.net/pokemongo/pokemon/013.png",
    "type": [
      "Bug",
      "Poison"
    ],
    "height": "0.30 m",
    "weight": "3.2 kg",
    "candy": "Weedle Candy",
    "candy_count": 12,
    "egg": "2 km",
    "spawn_chance": 7.12,
    "avg_spawns": 712,
    "spawn_time": "02:21",
    "multipliers": [
      1.01,
      1.09
    ],
    "weaknesses": [
      "Fire",
      "Flying",
      "Psychic",
      "Rock"
    ],
    "next_evolution": [{
      "num": "014",
      "name": "Kakuna"
    }, {
      "num": "015",
      "name": "Beedrill"
    }]
  }, {
    "id": 14,
    "num": "014",
    "name": "Kakuna",
    "img": "http://www.serebii.net/pokemongo/pokemon/014.png",
    "type": [
      "Bug",
      "Poison"
    ],
    "height": "0.61 m",
    "weight": "10.0 kg",
    "candy": "Weedle Candy",
    "candy_count": 50,
    "egg": "Not in Eggs",
    "spawn_chance": 0.44,
    "avg_spawns": 44,
    "spawn_time": "02:30",
    "multipliers": [
      3.01,
      3.41
    ],
    "weaknesses": [
      "Fire",
      "Flying",
      "Psychic",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "013",
      "name": "Weedle"
    }],
    "next_evolution": [{
      "num": "015",
      "name": "Beedrill"
    }]
  }, {
    "id": 15,
    "num": "015",
    "name": "Beedrill",
    "img": "http://www.serebii.net/pokemongo/pokemon/015.png",
    "type": [
      "Bug",
      "Poison"
    ],
    "height": "0.99 m",
    "weight": "29.5 kg",
    "candy": "Weedle Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.051,
    "avg_spawns": 5.1,
    "spawn_time": "04:50",
    "multipliers": null,
    "weaknesses": [
      "Fire",
      "Flying",
      "Psychic",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "013",
      "name": "Weedle"
    }, {
      "num": "014",
      "name": "Kakuna"
    }]
  }, {
    "id": 16,
    "num": "016",
    "name": "Pidgey",
    "img": "http://www.serebii.net/pokemongo/pokemon/016.png",
    "type": [
      "Normal",
      "Flying"
    ],
    "height": "0.30 m",
    "weight": "1.8 kg",
    "candy": "Pidgey Candy",
    "candy_count": 12,
    "egg": "2 km",
    "spawn_chance": 15.98,
    "avg_spawns": 1.598,
    "spawn_time": "01:34",
    "multipliers": [
      1.71,
      1.92
    ],
    "weaknesses": [
      "Electric",
      "Rock"
    ],
    "next_evolution": [{
      "num": "017",
      "name": "Pidgeotto"
    }, {
      "num": "018",
      "name": "Pidgeot"
    }]
  }, {
    "id": 17,
    "num": "017",
    "name": "Pidgeotto",
    "img": "http://www.serebii.net/pokemongo/pokemon/017.png",
    "type": [
      "Normal",
      "Flying"
    ],
    "height": "1.09 m",
    "weight": "30.0 kg",
    "candy": "Pidgey Candy",
    "candy_count": 50,
    "egg": "Not in Eggs",
    "spawn_chance": 1.02,
    "avg_spawns": 102,
    "spawn_time": "01:30",
    "multipliers": [1.79],
    "weaknesses": [
      "Electric",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "016",
      "name": "Pidgey"
    }],
    "next_evolution": [{
      "num": "018",
      "name": "Pidgeot"
    }]
  }, {
    "id": 18,
    "num": "018",
    "name": "Pidgeot",
    "img": "http://www.serebii.net/pokemongo/pokemon/018.png",
    "type": [
      "Normal",
      "Flying"
    ],
    "height": "1.50 m",
    "weight": "39.5 kg",
    "candy": "Pidgey Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.13,
    "avg_spawns": 13,
    "spawn_time": "01:50",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "016",
      "name": "Pidgey"
    }, {
      "num": "017",
      "name": "Pidgeotto"
    }]
  }, {
    "id": 19,
    "num": "019",
    "name": "Rattata",
    "img": "http://www.serebii.net/pokemongo/pokemon/019.png",
    "type": [
      "Normal"
    ],
    "height": "0.30 m",
    "weight": "3.5 kg",
    "candy": "Rattata Candy",
    "candy_count": 25,
    "egg": "2 km",
    "spawn_chance": 13.05,
    "avg_spawns": 1.305,
    "spawn_time": "01:55",
    "multipliers": [
      2.55,
      2.73
    ],
    "weaknesses": [
      "Fighting"
    ],
    "next_evolution": [{
      "num": "020",
      "name": "Raticate"
    }]
  }, {
    "id": 20,
    "num": "020",
    "name": "Raticate",
    "img": "http://www.serebii.net/pokemongo/pokemon/020.png",
    "type": [
      "Normal"
    ],
    "height": "0.71 m",
    "weight": "18.5 kg",
    "candy": "Rattata Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.41,
    "avg_spawns": 41,
    "spawn_time": "01:56",
    "multipliers": null,
    "weaknesses": [
      "Fighting"
    ],
    "prev_evolution": [{
      "num": "019",
      "name": "Rattata"
    }]
  }, {
    "id": 21,
    "num": "021",
    "name": "Spearow",
    "img": "http://www.serebii.net/pokemongo/pokemon/021.png",
    "type": [
      "Normal",
      "Flying"
    ],
    "height": "0.30 m",
    "weight": "2.0 kg",
    "candy": "Spearow Candy",
    "candy_count": 50,
    "egg": "2 km",
    "spawn_chance": 4.73,
    "avg_spawns": 473,
    "spawn_time": "12:25",
    "multipliers": [
      2.66,
      2.68
    ],
    "weaknesses": [
      "Electric",
      "Rock"
    ],
    "next_evolution": [{
      "num": "022",
      "name": "Fearow"
    }]
  }, {
    "id": 22,
    "num": "022",
    "name": "Fearow",
    "img": "http://www.serebii.net/pokemongo/pokemon/022.png",
    "type": [
      "Normal",
      "Flying"
    ],
    "height": "1.19 m",
    "weight": "38.0 kg",
    "candy": "Spearow Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.15,
    "avg_spawns": 15,
    "spawn_time": "01:11",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "021",
      "name": "Spearow"
    }]
  }, {
    "id": 23,
    "num": "023",
    "name": "Ekans",
    "img": "http://www.serebii.net/pokemongo/pokemon/023.png",
    "type": [
      "Poison"
    ],
    "height": "2.01 m",
    "weight": "6.9 kg",
    "candy": "Ekans Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 2.27,
    "avg_spawns": 227,
    "spawn_time": "12:20",
    "multipliers": [
      2.21,
      2.27
    ],
    "weaknesses": [
      "Ground",
      "Psychic"
    ],
    "next_evolution": [{
      "num": "024",
      "name": "Arbok"
    }]
  }, {
    "id": 24,
    "num": "024",
    "name": "Arbok",
    "img": "http://www.serebii.net/pokemongo/pokemon/024.png",
    "type": [
      "Poison"
    ],
    "height": "3.51 m",
    "weight": "65.0 kg",
    "candy": "Ekans Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.072,
    "avg_spawns": 7.2,
    "spawn_time": "01:50",
    "multipliers": null,
    "weaknesses": [
      "Ground",
      "Psychic"
    ],
    "prev_evolution": [{
      "num": "023",
      "name": "Ekans"
    }]
  }, {
    "id": 25,
    "num": "025",
    "name": "Pikachu",
    "img": "http://www.serebii.net/pokemongo/pokemon/025.png",
    "type": [
      "Electric"
    ],
    "height": "0.41 m",
    "weight": "6.0 kg",
    "candy": "Pikachu Candy",
    "candy_count": 50,
    "egg": "2 km",
    "spawn_chance": 0.21,
    "avg_spawns": 21,
    "spawn_time": "04:00",
    "multipliers": [2.34],
    "weaknesses": [
      "Ground"
    ],
    "next_evolution": [{
      "num": "026",
      "name": "Raichu"
    }]
  }, {
    "id": 26,
    "num": "026",
    "name": "Raichu",
    "img": "http://www.serebii.net/pokemongo/pokemon/026.png",
    "type": [
      "Electric"
    ],
    "height": "0.79 m",
    "weight": "30.0 kg",
    "candy": "Pikachu Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.0076,
    "avg_spawns": 0.76,
    "spawn_time": "23:58",
    "multipliers": null,
    "weaknesses": [
      "Ground"
    ],
    "prev_evolution": [{
      "num": "025",
      "name": "Pikachu"
    }]
  }, {
    "id": 27,
    "num": "027",
    "name": "Sandshrew",
    "img": "http://www.serebii.net/pokemongo/pokemon/027.png",
    "type": [
      "Ground"
    ],
    "height": "0.61 m",
    "weight": "12.0 kg",
    "candy": "Sandshrew Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 1.11,
    "avg_spawns": 111,
    "spawn_time": "01:58",
    "multipliers": [2.45],
    "weaknesses": [
      "Water",
      "Grass",
      "Ice"
    ],
    "next_evolution": [{
      "num": "028",
      "name": "Sandslash"
    }]
  }, {
    "id": 28,
    "num": "028",
    "name": "Sandslash",
    "img": "http://www.serebii.net/pokemongo/pokemon/028.png",
    "type": [
      "Ground"
    ],
    "height": "0.99 m",
    "weight": "29.5 kg",
    "candy": "Sandshrew Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.037,
    "avg_spawns": 3.7,
    "spawn_time": "12:34",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Grass",
      "Ice"
    ],
    "prev_evolution": [{
      "num": "027",
      "name": "Sandshrew"
    }]
  }, {
    "id": 29,
    "num": "029",
    "name": "Nidoran ♀ (Female)",
    "img": "http://www.serebii.net/pokemongo/pokemon/029.png",
    "type": [
      "Poison"
    ],
    "height": "0.41 m",
    "weight": "7.0 kg",
    "candy": "Nidoran ♀ (Female) Candy",
    "candy_count": 25,
    "egg": "5 km",
    "spawn_chance": 1.38,
    "avg_spawns": 138,
    "spawn_time": "01:51",
    "multipliers": [
      1.63,
      2.48
    ],
    "weaknesses": [
      "Ground",
      "Psychic"
    ],
    "next_evolution": [{
      "num": "030",
      "name": "Nidorina"
    }, {
      "num": "031",
      "name": "Nidoqueen"
    }]
  }, {
    "id": 30,
    "num": "030",
    "name": "Nidorina",
    "img": "http://www.serebii.net/pokemongo/pokemon/030.png",
    "type": [
      "Poison"
    ],
    "height": "0.79 m",
    "weight": "20.0 kg",
    "candy": "Nidoran ♀ (Female) Candy",
    "candy_count": 100,
    "egg": "Not in Eggs",
    "spawn_chance": 0.088,
    "avg_spawns": 8.8,
    "spawn_time": "07:22",
    "multipliers": [
      1.83,
      2.48
    ],
    "weaknesses": [
      "Ground",
      "Psychic"
    ],
    "prev_evolution": [{
      "num": "029",
      "name": "Nidoran(Female)"
    }],
    "next_evolution": [{
      "num": "031",
      "name": "Nidoqueen"
    }]
  }, {
    "id": 31,
    "num": "031",
    "name": "Nidoqueen",
    "img": "http://www.serebii.net/pokemongo/pokemon/031.png",
    "type": [
      "Poison",
      "Ground"
    ],
    "height": "1.30 m",
    "weight": "60.0 kg",
    "candy": "Nidoran ♀ (Female) Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.012,
    "avg_spawns": 1.2,
    "spawn_time": "12:35",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Ice",
      "Ground",
      "Psychic"
    ],
    "prev_evolution": [{
      "num": "029",
      "name": "Nidoran(Female)"
    }, {
      "num": "030",
      "name": "Nidorina"
    }]
  }, {
    "id": 32,
    "num": "032",
    "name": "Nidoran ♂ (Male)",
    "img": "http://www.serebii.net/pokemongo/pokemon/032.png",
    "type": [
      "Poison"
    ],
    "height": "0.51 m",
    "weight": "9.0 kg",
    "candy": "Nidoran ♂ (Male) Candy",
    "candy_count": 25,
    "egg": "5 km",
    "spawn_chance": 1.31,
    "avg_spawns": 131,
    "spawn_time": "01:12",
    "multipliers": [
      1.64,
      1.7
    ],
    "weaknesses": [
      "Ground",
      "Psychic"
    ],
    "next_evolution": [{
      "num": "033",
      "name": "Nidorino"
    }, {
      "num": "034",
      "name": "Nidoking"
    }]
  }, {
    "id": 33,
    "num": "033",
    "name": "Nidorino",
    "img": "http://www.serebii.net/pokemongo/pokemon/033.png",
    "type": [
      "Poison"
    ],
    "height": "0.89 m",
    "weight": "19.5 kg",
    "candy": "Nidoran ♂ (Male) Candy",
    "candy_count": 100,
    "egg": "Not in Eggs",
    "spawn_chance": 0.083,
    "avg_spawns": 8.3,
    "spawn_time": "09:02",
    "multipliers": [1.83],
    "weaknesses": [
      "Ground",
      "Psychic"
    ],
    "prev_evolution": [{
      "num": "032",
      "name": "Nidoran(Male)"
    }],
    "next_evolution": [{
      "num": "034",
      "name": "Nidoking"
    }]
  }, {
    "id": 34,
    "num": "034",
    "name": "Nidoking",
    "img": "http://www.serebii.net/pokemongo/pokemon/034.png",
    "type": [
      "Poison",
      "Ground"
    ],
    "height": "1.40 m",
    "weight": "62.0 kg",
    "candy": "Nidoran ♂ (Male) Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.017,
    "avg_spawns": 1.7,
    "spawn_time": "12:16",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Ice",
      "Ground",
      "Psychic"
    ],
    "prev_evolution": [{
      "num": "032",
      "name": "Nidoran(Male)"
    }, {
      "num": "033",
      "name": "Nidorino"
    }]
  }, {
    "id": 35,
    "num": "035",
    "name": "Clefairy",
    "img": "http://www.serebii.net/pokemongo/pokemon/035.png",
    "type": [
      "Normal"
    ],
    "height": "0.61 m",
    "weight": "7.5 kg",
    "candy": "Clefairy Candy",
    "candy_count": 50,
    "egg": "2 km",
    "spawn_chance": 0.92,
    "avg_spawns": 92,
    "spawn_time": "03:30",
    "multipliers": [
      2.03,
      2.14
    ],
    "weaknesses": [
      "Fighting"
    ],
    "next_evolution": [{
      "num": "036",
      "name": "Clefable"
    }]
  }, {
    "id": 36,
    "num": "036",
    "name": "Clefable",
    "img": "http://www.serebii.net/pokemongo/pokemon/036.png",
    "type": [
      "Normal"
    ],
    "height": "1.30 m",
    "weight": "40.0 kg",
    "candy": "Clefairy Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.012,
    "avg_spawns": 1.2,
    "spawn_time": "03:29",
    "multipliers": null,
    "weaknesses": [
      "Fighting"
    ],
    "prev_evolution": [{
      "num": "035",
      "name": "Clefairy"
    }]
  }, {
    "id": 37,
    "num": "037",
    "name": "Vulpix",
    "img": "http://www.serebii.net/pokemongo/pokemon/037.png",
    "type": [
      "Fire"
    ],
    "height": "0.61 m",
    "weight": "9.9 kg",
    "candy": "Vulpix Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.22,
    "avg_spawns": 22,
    "spawn_time": "13:43",
    "multipliers": [
      2.74,
      2.81
    ],
    "weaknesses": [
      "Water",
      "Ground",
      "Rock"
    ],
    "next_evolution": [{
      "num": "038",
      "name": "Ninetales"
    }]
  }, {
    "id": 38,
    "num": "038",
    "name": "Ninetales",
    "img": "http://www.serebii.net/pokemongo/pokemon/038.png",
    "type": [
      "Fire"
    ],
    "height": "1.09 m",
    "weight": "19.9 kg",
    "candy": "Vulpix Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.0077,
    "avg_spawns": 0.77,
    "spawn_time": "01:32",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Ground",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "037",
      "name": "Vulpix"
    }]
  }, {
    "id": 39,
    "num": "039",
    "name": "Jigglypuff",
    "img": "http://www.serebii.net/pokemongo/pokemon/039.png",
    "type": [
      "Normal"
    ],
    "height": "0.51 m",
    "weight": "5.5 kg",
    "candy": "Jigglypuff Candy",
    "candy_count": 50,
    "egg": "2 km",
    "spawn_chance": 0.39,
    "avg_spawns": 39,
    "spawn_time": "08:46",
    "multipliers": [1.85],
    "weaknesses": [
      "Fighting"
    ],
    "next_evolution": [{
      "num": "040",
      "name": "Wigglytuff"
    }]
  }, {
    "id": 40,
    "num": "040",
    "name": "Wigglytuff",
    "img": "http://www.serebii.net/pokemongo/pokemon/040.png",
    "type": [
      "Normal"
    ],
    "height": "0.99 m",
    "weight": "12.0 kg",
    "candy": "Jigglypuff Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.018,
    "avg_spawns": 1.8,
    "spawn_time": "12:28",
    "multipliers": null,
    "weaknesses": [
      "Fighting"
    ],
    "prev_evolution": [{
      "num": "039",
      "name": "Jigglypuff"
    }]
  }, {
    "id": 41,
    "num": "041",
    "name": "Zubat",
    "img": "http://www.serebii.net/pokemongo/pokemon/041.png",
    "type": [
      "Poison",
      "Flying"
    ],
    "height": "0.79 m",
    "weight": "7.5 kg",
    "candy": "Zubat Candy",
    "candy_count": 50,
    "egg": "2 km",
    "spawn_chance": 6.52,
    "avg_spawns": 652,
    "spawn_time": "12:28",
    "multipliers": [
      2.6,
      3.67
    ],
    "weaknesses": [
      "Electric",
      "Ice",
      "Psychic",
      "Rock"
    ],
    "next_evolution": [{
      "num": "042",
      "name": "Golbat"
    }]
  }, {
    "id": 42,
    "num": "042",
    "name": "Golbat",
    "img": "http://www.serebii.net/pokemongo/pokemon/042.png",
    "type": [
      "Poison",
      "Flying"
    ],
    "height": "1.60 m",
    "weight": "55.0 kg",
    "candy": "Zubat Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.42,
    "avg_spawns": 42,
    "spawn_time": "02:15",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Ice",
      "Psychic",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "041",
      "name": "Zubat"
    }]
  }, {
    "id": 43,
    "num": "043",
    "name": "Oddish",
    "img": "http://www.serebii.net/pokemongo/pokemon/043.png",
    "type": [
      "Grass",
      "Poison"
    ],
    "height": "0.51 m",
    "weight": "5.4 kg",
    "candy": "Oddish Candy",
    "candy_count": 25,
    "egg": "5 km",
    "spawn_chance": 1.02,
    "avg_spawns": 102,
    "spawn_time": "03:58",
    "multipliers": [1.5],
    "weaknesses": [
      "Fire",
      "Ice",
      "Flying",
      "Psychic"
    ],
    "next_evolution": [{
      "num": "044",
      "name": "Gloom"
    }, {
      "num": "045",
      "name": "Vileplume"
    }]
  }, {
    "id": 44,
    "num": "044",
    "name": "Gloom",
    "img": "http://www.serebii.net/pokemongo/pokemon/044.png",
    "type": [
      "Grass",
      "Poison"
    ],
    "height": "0.79 m",
    "weight": "8.6 kg",
    "candy": "Oddish Candy",
    "candy_count": 100,
    "egg": "Not in Eggs",
    "spawn_chance": 0.064,
    "avg_spawns": 6.4,
    "spawn_time": "11:33",
    "multipliers": [1.49],
    "weaknesses": [
      "Fire",
      "Ice",
      "Flying",
      "Psychic"
    ],
    "prev_evolution": [{
      "num": "043",
      "name": "Oddish"
    }],
    "next_evolution": [{
      "num": "045",
      "name": "Vileplume"
    }]
  }, {
    "id": 45,
    "num": "045",
    "name": "Vileplume",
    "img": "http://www.serebii.net/pokemongo/pokemon/045.png",
    "type": [
      "Grass",
      "Poison"
    ],
    "height": "1.19 m",
    "weight": "18.6 kg",
    "candy": "Oddish Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.0097,
    "avg_spawns": 0.97,
    "spawn_time": "23:58",
    "multipliers": null,
    "weaknesses": [
      "Fire",
      "Ice",
      "Flying",
      "Psychic"
    ],
    "prev_evolution": [{
      "num": "043",
      "name": "Oddish"
    }, {
      "num": "044",
      "name": "Gloom"
    }]
  }, {
    "id": 46,
    "num": "046",
    "name": "Paras",
    "img": "http://www.serebii.net/pokemongo/pokemon/046.png",
    "type": [
      "Bug",
      "Grass"
    ],
    "height": "0.30 m",
    "weight": "5.4 kg",
    "candy": "Paras Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 2.36,
    "avg_spawns": 236,
    "spawn_time": "01:42",
    "multipliers": [2.02],
    "weaknesses": [
      "Fire",
      "Ice",
      "Poison",
      "Flying",
      "Bug",
      "Rock"
    ],
    "next_evolution": [{
      "num": "047",
      "name": "Parasect"
    }]
  }, {
    "id": 47,
    "num": "047",
    "name": "Parasect",
    "img": "http://www.serebii.net/pokemongo/pokemon/047.png",
    "type": [
      "Bug",
      "Grass"
    ],
    "height": "0.99 m",
    "weight": "29.5 kg",
    "candy": "Paras Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.074,
    "avg_spawns": 7.4,
    "spawn_time": "01:22",
    "multipliers": null,
    "weaknesses": [
      "Fire",
      "Ice",
      "Poison",
      "Flying",
      "Bug",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "046",
      "name": "Paras"
    }]
  }, {
    "id": 48,
    "num": "048",
    "name": "Venonat",
    "img": "http://www.serebii.net/pokemongo/pokemon/048.png",
    "type": [
      "Bug",
      "Poison"
    ],
    "height": "0.99 m",
    "weight": "30.0 kg",
    "candy": "Venonat Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 2.28,
    "avg_spawns": 228,
    "spawn_time": "02:31",
    "multipliers": [
      1.86,
      1.9
    ],
    "weaknesses": [
      "Fire",
      "Flying",
      "Psychic",
      "Rock"
    ],
    "next_evolution": [{
      "num": "049",
      "name": "Venomoth"
    }]
  }, {
    "id": 49,
    "num": "049",
    "name": "Venomoth",
    "img": "http://www.serebii.net/pokemongo/pokemon/049.png",
    "type": [
      "Bug",
      "Poison"
    ],
    "height": "1.50 m",
    "weight": "12.5 kg",
    "candy": "Venonat Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.072,
    "avg_spawns": 7.2,
    "spawn_time": "23:40",
    "multipliers": null,
    "weaknesses": [
      "Fire",
      "Flying",
      "Psychic",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "048",
      "name": "Venonat"
    }]
  }, {
    "id": 50,
    "num": "050",
    "name": "Diglett",
    "img": "http://www.serebii.net/pokemongo/pokemon/050.png",
    "type": [
      "Ground"
    ],
    "height": "0.20 m",
    "weight": "0.8 kg",
    "candy": "Diglett Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.40,
    "avg_spawns": 40,
    "spawn_time": "02:22",
    "multipliers": [2.69],
    "weaknesses": [
      "Water",
      "Grass",
      "Ice"
    ],
    "next_evolution": [{
      "num": "051",
      "name": "Dugtrio"
    }]
  }, {
    "id": 51,
    "num": "051",
    "name": "Dugtrio",
    "img": "http://www.serebii.net/pokemongo/pokemon/051.png",
    "type": [
      "Ground"
    ],
    "height": "0.71 m",
    "weight": "33.3 kg",
    "candy": "Dugtrio",
    "egg": "Not in Eggs",
    "spawn_chance": 0.014,
    "avg_spawns": 1.4,
    "spawn_time": "12:37",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Grass",
      "Ice"
    ],
    "prev_evolution": [{
      "num": "050",
      "name": "Diglett"
    }]
  }, {
    "id": 52,
    "num": "052",
    "name": "Meowth",
    "img": "http://www.serebii.net/pokemongo/pokemon/052.png",
    "type": [
      "Normal"
    ],
    "height": "0.41 m",
    "weight": "4.2 kg",
    "candy": "Meowth Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.86,
    "avg_spawns": 86,
    "spawn_time": "02:54",
    "multipliers": [1.98],
    "weaknesses": [
      "Fighting"
    ],
    "next_evolution": [{
      "num": "053",
      "name": "Persian"
    }]
  }, {
    "id": 53,
    "num": "053",
    "name": "Persian",
    "img": "http://www.serebii.net/pokemongo/pokemon/053.png",
    "type": [
      "Normal"
    ],
    "height": "0.99 m",
    "weight": "32.0 kg",
    "candy": "Meowth Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.022,
    "avg_spawns": 2.2,
    "spawn_time": "02:44",
    "multipliers": null,
    "weaknesses": [
      "Fighting"
    ],
    "prev_evolution": [{
      "num": "052",
      "name": "Meowth"
    }]
  }, {
    "id": 54,
    "num": "054",
    "name": "Psyduck",
    "img": "http://www.serebii.net/pokemongo/pokemon/054.png",
    "type": [
      "Water"
    ],
    "height": "0.79 m",
    "weight": "19.6 kg",
    "candy": "Psyduck Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 2.54,
    "avg_spawns": 254,
    "spawn_time": "03:41",
    "multipliers": [2.27],
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "next_evolution": [{
      "num": "055",
      "name": "Golduck"
    }]
  }, {
    "id": 55,
    "num": "055",
    "name": "Golduck",
    "img": "http://www.serebii.net/pokemongo/pokemon/055.png",
    "type": [
      "Water"
    ],
    "height": "1.70 m",
    "weight": "76.6 kg",
    "candy": "Psyduck Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.087,
    "avg_spawns": 8.7,
    "spawn_time": "23:06",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "prev_evolution": [{
      "num": "054",
      "name": "Psyduck"
    }]
  }, {
    "id": 56,
    "num": "056",
    "name": "Mankey",
    "img": "http://www.serebii.net/pokemongo/pokemon/056.png",
    "type": [
      "Fighting"
    ],
    "height": "0.51 m",
    "weight": "28.0 kg",
    "candy": "Mankey Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.92,
    "avg_spawns": 92,
    "spawn_time": "12:52",
    "multipliers": [
      2.17,
      2.28
    ],
    "weaknesses": [
      "Flying",
      "Psychic",
      "Fairy"
    ],
    "next_evolution": [{
      "num": "057",
      "name": "Primeape"
    }]
  }, {
    "id": 57,
    "num": "057",
    "name": "Primeape",
    "img": "http://www.serebii.net/pokemongo/pokemon/057.png",
    "type": [
      "Fighting"
    ],
    "height": "0.99 m",
    "weight": "32.0 kg",
    "candy": "Mankey Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.031,
    "avg_spawns": 3.1,
    "spawn_time": "12:33",
    "multipliers": null,
    "weaknesses": [
      "Flying",
      "Psychic",
      "Fairy"
    ],
    "prev_evolution": [{
      "num": "056",
      "name": "Mankey"
    }]
  }, {
    "id": 58,
    "num": "058",
    "name": "Growlithe",
    "img": "http://www.serebii.net/pokemongo/pokemon/058.png",
    "type": [
      "Fire"
    ],
    "height": "0.71 m",
    "weight": "19.0 kg",
    "candy": "Growlithe Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.92,
    "avg_spawns": 92,
    "spawn_time": "03:57",
    "multipliers": [
      2.31,
      2.36
    ],
    "weaknesses": [
      "Water",
      "Ground",
      "Rock"
    ],
    "next_evolution": [{
      "num": "059",
      "name": "Arcanine"
    }]
  }, {
    "id": 59,
    "num": "059",
    "name": "Arcanine",
    "img": "http://www.serebii.net/pokemongo/pokemon/059.png",
    "type": [
      "Fire"
    ],
    "height": "1.91 m",
    "weight": "155.0 kg",
    "candy": "Growlithe Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.017,
    "avg_spawns": 1.7,
    "spawn_time": "03:11",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Ground",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "058",
      "name": "Growlithe"
    }]
  }, {
    "id": 60,
    "num": "060",
    "name": "Poliwag",
    "img": "http://www.serebii.net/pokemongo/pokemon/060.png",
    "type": [
      "Water"
    ],
    "height": "0.61 m",
    "weight": "12.4 kg",
    "candy": "Poliwag Candy",
    "candy_count": 25,
    "egg": "5 km",
    "spawn_chance": 2.19,
    "avg_spawns": 219,
    "spawn_time": "03:40",
    "multipliers": [
      1.72,
      1.73
    ],
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "next_evolution": [{
      "num": "061",
      "name": "Poliwhirl"
    }, {
      "num": "062",
      "name": "Poliwrath"
    }]
  }, {
    "id": 61,
    "num": "061",
    "name": "Poliwhirl",
    "img": "http://www.serebii.net/pokemongo/pokemon/061.png",
    "type": [
      "Water"
    ],
    "height": "0.99 m",
    "weight": "20.0 kg",
    "candy": "Poliwag Candy",
    "candy_count": 100,
    "egg": "Not in Eggs",
    "spawn_chance": 0.13,
    "avg_spawns": 13,
    "spawn_time": "09:14",
    "multipliers": [1.95],
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "prev_evolution": [{
      "num": "060",
      "name": "Poliwag"
    }],
    "next_evolution": [{
      "num": "062",
      "name": "Poliwrath"
    }]
  }, {
    "id": 62,
    "num": "062",
    "name": "Poliwrath",
    "img": "http://www.serebii.net/pokemongo/pokemon/062.png",
    "type": [
      "Water",
      "Fighting"
    ],
    "height": "1.30 m",
    "weight": "54.0 kg",
    "candy": "Poliwag Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.011,
    "avg_spawns": 1.1,
    "spawn_time": "01:32",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Grass",
      "Flying",
      "Psychic",
      "Fairy"
    ],
    "prev_evolution": [{
      "num": "060",
      "name": "Poliwag"
    }, {
      "num": "061",
      "name": "Poliwhirl"
    }]
  }, {
    "id": 63,
    "num": "063",
    "name": "Abra",
    "img": "http://www.serebii.net/pokemongo/pokemon/063.png",
    "type": [
      "Psychic"
    ],
    "height": "0.89 m",
    "weight": "19.5 kg",
    "candy": "Abra Candy",
    "candy_count": 25,
    "egg": "5 km",
    "spawn_chance": 0.42,
    "avg_spawns": 42,
    "spawn_time": "04:30",
    "multipliers": [
      1.36,
      1.95
    ],
    "weaknesses": [
      "Bug",
      "Ghost",
      "Dark"
    ],
    "next_evolution": [{
      "num": "064",
      "name": "Kadabra"
    }, {
      "num": "065",
      "name": "Alakazam"
    }]
  }, {
    "id": 64,
    "num": "064",
    "name": "Kadabra",
    "img": "http://www.serebii.net/pokemongo/pokemon/064.png",
    "type": [
      "Psychic"
    ],
    "height": "1.30 m",
    "weight": "56.5 kg",
    "candy": "Abra Candy",
    "candy_count": 100,
    "egg": "Not in Eggs",
    "spawn_chance": 0.027,
    "avg_spawns": 2.7,
    "spawn_time": "11:25",
    "multipliers": [1.4],
    "weaknesses": [
      "Bug",
      "Ghost",
      "Dark"
    ],
    "prev_evolution": [{
      "num": "063",
      "name": "Abra"
    }],
    "next_evolution": [{
      "num": "065",
      "name": "Alakazam"
    }]
  }, {
    "id": 65,
    "num": "065",
    "name": "Alakazam",
    "img": "http://www.serebii.net/pokemongo/pokemon/065.png",
    "type": [
      "Psychic"
    ],
    "height": "1.50 m",
    "weight": "48.0 kg",
    "candy": "Abra Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.0073,
    "avg_spawns": 0.73,
    "spawn_time": "12:33",
    "multipliers": null,
    "weaknesses": [
      "Bug",
      "Ghost",
      "Dark"
    ],
    "prev_evolution": [{
      "num": "063",
      "name": "Abra"
    }, {
      "num": "064",
      "name": "Kadabra"
    }]
  }, {
    "id": 66,
    "num": "066",
    "name": "Machop",
    "img": "http://www.serebii.net/pokemongo/pokemon/066.png",
    "type": [
      "Fighting"
    ],
    "height": "0.79 m",
    "weight": "19.5 kg",
    "candy": "Machop Candy",
    "candy_count": 25,
    "egg": "5 km",
    "spawn_chance": 0.49,
    "avg_spawns": 49,
    "spawn_time": "01:55",
    "multipliers": [
      1.64,
      1.65
    ],
    "weaknesses": [
      "Flying",
      "Psychic",
      "Fairy"
    ],
    "next_evolution": [{
      "num": "067",
      "name": "Machoke"
    }, {
      "num": "068",
      "name": "Machamp"
    }]
  }, {
    "id": 67,
    "num": "067",
    "name": "Machoke",
    "img": "http://www.serebii.net/pokemongo/pokemon/067.png",
    "type": [
      "Fighting"
    ],
    "height": "1.50 m",
    "weight": "70.5 kg",
    "candy": "Machop Candy",
    "candy_count": 100,
    "egg": "Not in Eggs",
    "spawn_chance": 0.034,
    "avg_spawns": 3.4,
    "spawn_time": "10:32",
    "multipliers": [1.7],
    "weaknesses": [
      "Flying",
      "Psychic",
      "Fairy"
    ],
    "prev_evolution": [{
      "num": "066",
      "name": "Machop"
    }],
    "next_evolution": [{
      "num": "068",
      "name": "Machamp"
    }]
  }, {
    "id": 68,
    "num": "068",
    "name": "Machamp",
    "img": "http://www.serebii.net/pokemongo/pokemon/068.png",
    "type": [
      "Fighting"
    ],
    "height": "1.60 m",
    "weight": "130.0 kg",
    "candy": "Machop Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.0068,
    "avg_spawns": 0.68,
    "spawn_time": "02:55",
    "multipliers": null,
    "weaknesses": [
      "Flying",
      "Psychic",
      "Fairy"
    ],
    "prev_evolution": [{
      "num": "066",
      "name": "Machop"
    }, {
      "num": "067",
      "name": "Machoke"
    }]
  }, {
    "id": 69,
    "num": "069",
    "name": "Bellsprout",
    "img": "http://www.serebii.net/pokemongo/pokemon/069.png",
    "type": [
      "Grass",
      "Poison"
    ],
    "height": "0.71 m",
    "weight": "4.0 kg",
    "candy": "Bellsprout Candy",
    "candy_count": 25,
    "egg": "5 km",
    "spawn_chance": 1.15,
    "avg_spawns": 115,
    "spawn_time": "04:10",
    "multipliers": [1.57],
    "weaknesses": [
      "Fire",
      "Ice",
      "Flying",
      "Psychic"
    ],
    "next_evolution": [{
      "num": "070",
      "name": "Weepinbell"
    }, {
      "num": "071",
      "name": "Victreebel"
    }]
  }, {
    "id": 70,
    "num": "070",
    "name": "Weepinbell",
    "img": "http://www.serebii.net/pokemongo/pokemon/070.png",
    "type": [
      "Grass",
      "Poison"
    ],
    "height": "0.99 m",
    "weight": "6.4 kg",
    "candy": "Bellsprout Candy",
    "candy_count": 100,
    "egg": "Not in Eggs",
    "spawn_chance": 0.072,
    "avg_spawns": 7.2,
    "spawn_time": "09:45",
    "multipliers": [1.59],
    "weaknesses": [
      "Fire",
      "Ice",
      "Flying",
      "Psychic"
    ],
    "prev_evolution": [{
      "num": "069",
      "name": "Bellsprout"
    }],
    "next_evolution": [{
      "num": "071",
      "name": "Victreebel"
    }]
  }, {
    "id": 71,
    "num": "071",
    "name": "Victreebel",
    "img": "http://www.serebii.net/pokemongo/pokemon/071.png",
    "type": [
      "Grass",
      "Poison"
    ],
    "height": "1.70 m",
    "weight": "15.5 kg",
    "candy": "Bellsprout Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.0059,
    "avg_spawns": 0.59,
    "spawn_time": "12:19",
    "multipliers": null,
    "weaknesses": [
      "Fire",
      "Ice",
      "Flying",
      "Psychic"
    ],
    "prev_evolution": [{
      "num": "069",
      "name": "Bellsprout"
    }, {
      "num": "070",
      "name": "Weepinbell"
    }]
  }, {
    "id": 72,
    "num": "072",
    "name": "Tentacool",
    "img": "http://www.serebii.net/pokemongo/pokemon/072.png",
    "type": [
      "Water",
      "Poison"
    ],
    "height": "0.89 m",
    "weight": "45.5 kg",
    "candy": "Tentacool Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.81,
    "avg_spawns": 81,
    "spawn_time": "03:20",
    "multipliers": [2.52],
    "weaknesses": [
      "Electric",
      "Ground",
      "Psychic"
    ],
    "next_evolution": [{
      "num": "073",
      "name": "Tentacruel"
    }]
  }, {
    "id": 73,
    "num": "073",
    "name": "Tentacruel",
    "img": "http://www.serebii.net/pokemongo/pokemon/073.png",
    "type": [
      "Water",
      "Poison"
    ],
    "height": "1.60 m",
    "weight": "55.0 kg",
    "candy": "Tentacool Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.082,
    "avg_spawns": 8.2,
    "spawn_time": "23:36",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Ground",
      "Psychic"
    ],
    "prev_evolution": [{
      "num": "072",
      "name": "Tentacool"
    }]
  }, {
    "id": 74,
    "num": "074",
    "name": "Geodude",
    "img": "http://www.serebii.net/pokemongo/pokemon/074.png",
    "type": [
      "Rock",
      "Ground"
    ],
    "height": "0.41 m",
    "weight": "20.0 kg",
    "candy": "Geodude Candy",
    "candy_count": 25,
    "egg": "2 km",
    "spawn_chance": 1.19,
    "avg_spawns": 119,
    "spawn_time": "12:40",
    "multipliers": [
      1.75,
      1.76
    ],
    "weaknesses": [
      "Water",
      "Grass",
      "Ice",
      "Fighting",
      "Ground",
      "Steel"
    ],
    "next_evolution": [{
      "num": "075",
      "name": "Graveler"
    }, {
      "num": "076",
      "name": "Golem"
    }]
  }, {
    "id": 75,
    "num": "075",
    "name": "Graveler",
    "img": "http://www.serebii.net/pokemongo/pokemon/075.png",
    "type": [
      "Rock",
      "Ground"
    ],
    "height": "0.99 m",
    "weight": "105.0 kg",
    "candy": "Geodude Candy",
    "candy_count": 100,
    "egg": "Not in Eggs",
    "spawn_chance": 0.071,
    "avg_spawns": 7.1,
    "spawn_time": "04:53",
    "multipliers": [
      1.64,
      1.72
    ],
    "weaknesses": [
      "Water",
      "Grass",
      "Ice",
      "Fighting",
      "Ground",
      "Steel"
    ],
    "prev_evolution": [{
      "num": "074",
      "name": "Geodude"
    }],
    "next_evolution": [{
      "num": "076",
      "name": "Golem"
    }]
  }, {
    "id": 76,
    "num": "076",
    "name": "Golem",
    "img": "http://www.serebii.net/pokemongo/pokemon/076.png",
    "type": [
      "Rock",
      "Ground"
    ],
    "height": "1.40 m",
    "weight": "300.0 kg",
    "candy": "Geodude Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.0047,
    "avg_spawns": 0.47,
    "spawn_time": "12:16",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Grass",
      "Ice",
      "Fighting",
      "Ground",
      "Steel"
    ],
    "prev_evolution": [{
      "num": "074",
      "name": "Geodude"
    }, {
      "num": "075",
      "name": "Graveler"
    }]
  }, {
    "id": 77,
    "num": "077",
    "name": "Ponyta",
    "img": "http://www.serebii.net/pokemongo/pokemon/077.png",
    "type": [
      "Fire"
    ],
    "height": "0.99 m",
    "weight": "30.0 kg",
    "candy": "Ponyta Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.51,
    "avg_spawns": 51,
    "spawn_time": "02:50",
    "multipliers": [
      1.48,
      1.5
    ],
    "weaknesses": [
      "Water",
      "Ground",
      "Rock"
    ],
    "next_evolution": [{
      "num": "078",
      "name": "Rapidash"
    }]
  }, {
    "id": 78,
    "num": "078",
    "name": "Rapidash",
    "img": "http://www.serebii.net/pokemongo/pokemon/078.png",
    "type": [
      "Fire"
    ],
    "height": "1.70 m",
    "weight": "95.0 kg",
    "candy": "Ponyta Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.011,
    "avg_spawns": 1.1,
    "spawn_time": "04:00",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Ground",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "077",
      "name": "Ponyta"
    }]
  }, {
    "id": 79,
    "num": "079",
    "name": "Slowpoke",
    "img": "http://www.serebii.net/pokemongo/pokemon/079.png",
    "type": [
      "Water",
      "Psychic"
    ],
    "height": "1.19 m",
    "weight": "36.0 kg",
    "candy": "Slowpoke Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 1.05,
    "avg_spawns": 105,
    "spawn_time": "07:12",
    "multipliers": [2.21],
    "weaknesses": [
      "Electric",
      "Grass",
      "Bug",
      "Ghost",
      "Dark"
    ],
    "next_evolution": [{
      "num": "080",
      "name": "Slowbro"
    }]
  }, {
    "id": 80,
    "num": "080",
    "name": "Slowbro",
    "img": "http://www.serebii.net/pokemongo/pokemon/080.png",
    "type": [
      "Water",
      "Psychic"
    ],
    "height": "1.60 m",
    "weight": "78.5 kg",
    "candy": "Slowpoke Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.036,
    "avg_spawns": 3.6,
    "spawn_time": "02:56",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Grass",
      "Bug",
      "Ghost",
      "Dark"
    ],
    "prev_evolution": [{
      "num": "079",
      "name": "Slowpoke"
    }]
  }, {
    "id": 81,
    "num": "081",
    "name": "Magnemite",
    "img": "http://www.serebii.net/pokemongo/pokemon/081.png",
    "type": [
      "Electric"
    ],
    "height": "0.30 m",
    "weight": "6.0 kg",
    "candy": "Magnemite Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.71,
    "avg_spawns": 71,
    "spawn_time": "04:04",
    "multipliers": [
      2.16,
      2.17
    ],
    "weaknesses": [
      "Fire",
      "Water",
      "Ground"
    ],
    "next_evolution": [{
      "num": "082",
      "name": "Magneton"
    }]
  }, {
    "id": 82,
    "num": "082",
    "name": "Magneton",
    "img": "http://www.serebii.net/pokemongo/pokemon/082.png",
    "type": [
      "Electric"
    ],
    "height": "0.99 m",
    "weight": "60.0 kg",
    "candy": "Magnemite Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.023,
    "avg_spawns": 2.3,
    "spawn_time": "15:25",
    "multipliers": null,
    "weaknesses": [
      "Fire",
      "Water",
      "Ground"
    ],
    "prev_evolution": [{
      "num": "081",
      "name": "Magnemite"
    }]
  }, {
    "id": 83,
    "num": "083",
    "name": "Farfetch'd",
    "img": "http://www.serebii.net/pokemongo/pokemon/083.png",
    "type": [
      "Normal",
      "Flying"
    ],
    "height": "0.79 m",
    "weight": "15.0 kg",
    "candy": "None",
    "egg": "5 km",
    "spawn_chance": 0.0212,
    "avg_spawns": 2.12,
    "spawn_time": "01:09",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Rock"
    ]
  }, {
    "id": 84,
    "num": "084",
    "name": "Doduo",
    "img": "http://www.serebii.net/pokemongo/pokemon/084.png",
    "type": [
      "Normal",
      "Flying"
    ],
    "height": "1.40 m",
    "weight": "39.2 kg",
    "candy": "Doduo Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.52,
    "avg_spawns": 52,
    "spawn_time": "05:10",
    "multipliers": [
      2.19,
      2.24
    ],
    "weaknesses": [
      "Electric",
      "Rock"
    ],
    "next_evolution": [{
      "num": "085",
      "name": "Dodrio"
    }]
  }, {
    "id": 85,
    "num": "085",
    "name": "Dodrio",
    "img": "http://www.serebii.net/pokemongo/pokemon/085.png",
    "type": [
      "Normal",
      "Flying"
    ],
    "height": "1.80 m",
    "weight": "85.2 kg",
    "candy": "Doduo Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.22,
    "avg_spawns": 22,
    "spawn_time": "02:12",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "084",
      "name": "Doduo"
    }]
  }, {
    "id": 86,
    "num": "086",
    "name": "Seel",
    "img": "http://www.serebii.net/pokemongo/pokemon/086.png",
    "type": [
      "Water"
    ],
    "height": "1.09 m",
    "weight": "90.0 kg",
    "candy": "Seel Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.28,
    "avg_spawns": 28,
    "spawn_time": "06:46",
    "multipliers": [
      1.04,
      1.96
    ],
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "next_evolution": [{
      "num": "087",
      "name": "Dewgong"
    }]
  }, {
    "id": 87,
    "num": "087",
    "name": "Dewgong",
    "img": "http://www.serebii.net/pokemongo/pokemon/087.png",
    "type": [
      "Water",
      "Ice"
    ],
    "height": "1.70 m",
    "weight": "120.0 kg",
    "candy": "Seel Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.013,
    "avg_spawns": 1.3,
    "spawn_time": "06:04",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Grass",
      "Fighting",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "086",
      "name": "Seel"
    }]
  }, {
    "id": 88,
    "num": "088",
    "name": "Grimer",
    "img": "http://www.serebii.net/pokemongo/pokemon/088.png",
    "type": [
      "Poison"
    ],
    "height": "0.89 m",
    "weight": "30.0 kg",
    "candy": "Grimer Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.052,
    "avg_spawns": 5.2,
    "spawn_time": "15:11",
    "multipliers": [2.44],
    "weaknesses": [
      "Ground",
      "Psychic"
    ],
    "next_evolution": [{
      "num": "089",
      "name": "Muk"
    }]
  }, {
    "id": 89,
    "num": "089",
    "name": "Muk",
    "img": "http://www.serebii.net/pokemongo/pokemon/089.png",
    "type": [
      "Poison"
    ],
    "height": "1.19 m",
    "weight": "30.0 kg",
    "candy": "Grimer Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.0031,
    "avg_spawns": 0.31,
    "spawn_time": "01:28",
    "multipliers": null,
    "weaknesses": [
      "Ground",
      "Psychic"
    ],
    "prev_evolution": [{
      "num": "088",
      "name": "Grimer"
    }]
  }, {
    "id": 90,
    "num": "090",
    "name": "Shellder",
    "img": "http://www.serebii.net/pokemongo/pokemon/090.png",
    "type": [
      "Water"
    ],
    "height": "0.30 m",
    "weight": "4.0 kg",
    "candy": "Shellder Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.52,
    "avg_spawns": 52,
    "spawn_time": "07:39",
    "multipliers": [2.65],
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "next_evolution": [{
      "num": "091",
      "name": "Cloyster"
    }]
  }, {
    "id": 91,
    "num": "091",
    "name": "Cloyster",
    "img": "http://www.serebii.net/pokemongo/pokemon/091.png",
    "type": [
      "Water",
      "Ice"
    ],
    "height": "1.50 m",
    "weight": "132.5 kg",
    "candy": "Shellder Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.015,
    "avg_spawns": 1.5,
    "spawn_time": "02:33",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Grass",
      "Fighting",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "090",
      "name": "Shellder"
    }]
  }, {
    "id": 92,
    "num": "092",
    "name": "Gastly",
    "img": "http://www.serebii.net/pokemongo/pokemon/092.png",
    "type": [
      "Ghost",
      "Poison"
    ],
    "height": "1.30 m",
    "weight": "0.1 kg",
    "candy": "Gastly Candy",
    "candy_count": 25,
    "egg": "5 km",
    "spawn_chance": 0.79,
    "avg_spawns": 79,
    "spawn_time": "04:21",
    "multipliers": [1.78],
    "weaknesses": [
      "Ground",
      "Psychic",
      "Ghost",
      "Dark"
    ],
    "next_evolution": [{
      "num": "093",
      "name": "Haunter"
    }, {
      "num": "094",
      "name": "Gengar"
    }]
  }, {
    "id": 93,
    "num": "093",
    "name": "Haunter",
    "img": "http://www.serebii.net/pokemongo/pokemon/093.png",
    "type": [
      "Ghost",
      "Poison"
    ],
    "height": "1.60 m",
    "weight": "0.1 kg",
    "candy": "Gastly Candy",
    "candy_count": 100,
    "egg": "Not in Eggs",
    "spawn_chance": 0.052,
    "avg_spawns": 5.2,
    "spawn_time": "00:10",
    "multipliers": [
      1.56,
      1.8
    ],
    "weaknesses": [
      "Ground",
      "Psychic",
      "Ghost",
      "Dark"
    ],
    "prev_evolution": [{
      "num": "092",
      "name": "Gastly"
    }],
    "next_evolution": [{
      "num": "094",
      "name": "Gengar"
    }]
  }, {
    "id": 94,
    "num": "094",
    "name": "Gengar",
    "img": "http://www.serebii.net/pokemongo/pokemon/094.png",
    "type": [
      "Ghost",
      "Poison"
    ],
    "height": "1.50 m",
    "weight": "40.5 kg",
    "candy": "Gastly Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.0067,
    "avg_spawns": 0.67,
    "spawn_time": "03:55",
    "multipliers": null,
    "weaknesses": [
      "Ground",
      "Psychic",
      "Ghost",
      "Dark"
    ],
    "prev_evolution": [{
      "num": "092",
      "name": "Gastly"
    }, {
      "num": "093",
      "name": "Haunter"
    }]
  }, {
    "id": 95,
    "num": "095",
    "name": "Onix",
    "img": "http://www.serebii.net/pokemongo/pokemon/095.png",
    "type": [
      "Rock",
      "Ground"
    ],
    "height": "8.79 m",
    "weight": "210.0 kg",
    "candy": "None",
    "egg": "10 km",
    "spawn_chance": 0.10,
    "avg_spawns": 10,
    "spawn_time": "01:18",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Grass",
      "Ice",
      "Fighting",
      "Ground",
      "Steel"
    ]
  }, {
    "id": 96,
    "num": "096",
    "name": "Drowzee",
    "img": "http://www.serebii.net/pokemongo/pokemon/096.png",
    "type": [
      "Psychic"
    ],
    "height": "0.99 m",
    "weight": "32.4 kg",
    "candy": "Drowzee Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 3.21,
    "avg_spawns": 321,
    "spawn_time": "01:51",
    "multipliers": [
      2.08,
      2.09
    ],
    "weaknesses": [
      "Bug",
      "Ghost",
      "Dark"
    ],
    "next_evolution": [{
      "num": "097",
      "name": "Hypno"
    }]
  }, {
    "id": 97,
    "num": "097",
    "name": "Hypno",
    "img": "http://www.serebii.net/pokemongo/pokemon/097.png",
    "type": [
      "Psychic"
    ],
    "height": "1.60 m",
    "weight": "75.6 kg",
    "candy": "Drowzee Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.10,
    "avg_spawns": 10,
    "spawn_time": "02:17",
    "multipliers": null,
    "weaknesses": [
      "Bug",
      "Ghost",
      "Dark"
    ],
    "prev_evolution": [{
      "num": "096",
      "name": "Drowzee"
    }]
  }, {
    "id": 98,
    "num": "098",
    "name": "Krabby",
    "img": "http://www.serebii.net/pokemongo/pokemon/098.png",
    "type": [
      "Water"
    ],
    "height": "0.41 m",
    "weight": "6.5 kg",
    "candy": "Krabby Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 2.12,
    "avg_spawns": 212,
    "spawn_time": "03:33",
    "multipliers": [
      2.36,
      2.4
    ],
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "next_evolution": [{
      "num": "099",
      "name": "Kingler"
    }]
  }, {
    "id": 99,
    "num": "099",
    "name": "Kingler",
    "img": "http://www.serebii.net/pokemongo/pokemon/099.png",
    "type": [
      "Water"
    ],
    "height": "1.30 m",
    "weight": "60.0 kg",
    "candy": "Krabby Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.062,
    "avg_spawns": 6.2,
    "spawn_time": "03:44",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "prev_evolution": [{
      "num": "098",
      "name": "Krabby"
    }]
  }, {
    "id": 100,
    "num": "100",
    "name": "Voltorb",
    "img": "http://www.serebii.net/pokemongo/pokemon/100.png",
    "type": [
      "Electric"
    ],
    "height": "0.51 m",
    "weight": "10.4 kg",
    "candy": "Voltorb Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.65,
    "avg_spawns": 65,
    "spawn_time": "04:36",
    "multipliers": [
      2.01,
      2.02
    ],
    "weaknesses": [
      "Ground"
    ],
    "next_evolution": [{
      "num": "101",
      "name": "Electrode"
    }]
  }, {
    "id": 101,
    "num": "101",
    "name": "Electrode",
    "img": "http://www.serebii.net/pokemongo/pokemon/101.png",
    "type": [
      "Electric"
    ],
    "height": "1.19 m",
    "weight": "66.6 kg",
    "candy": "Voltorb Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.02,
    "avg_spawns": 2,
    "spawn_time": "04:10",
    "multipliers": null,
    "weaknesses": [
      "Ground"
    ],
    "prev_evolution": [{
      "num": "100",
      "name": "Voltorb"
    }]
  }, {
    "id": 102,
    "num": "102",
    "name": "Exeggcute",
    "img": "http://www.serebii.net/pokemongo/pokemon/102.png",
    "type": [
      "Grass",
      "Psychic"
    ],
    "height": "0.41 m",
    "weight": "2.5 kg",
    "candy": "Exeggcute Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.78,
    "avg_spawns": 78,
    "spawn_time": "09:09",
    "multipliers": [
      2.7,
      3.18
    ],
    "weaknesses": [
      "Fire",
      "Ice",
      "Poison",
      "Flying",
      "Bug",
      "Ghost",
      "Dark"
    ],
    "next_evolution": [{
      "num": "103",
      "name": "Exeggutor"
    }]
  }, {
    "id": 103,
    "num": "103",
    "name": "Exeggutor",
    "img": "http://www.serebii.net/pokemongo/pokemon/103.png",
    "type": [
      "Grass",
      "Psychic"
    ],
    "height": "2.01 m",
    "weight": "120.0 kg",
    "candy": "Exeggcute Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.014,
    "avg_spawns": 1.4,
    "spawn_time": "12:34",
    "multipliers": null,
    "weaknesses": [
      "Fire",
      "Ice",
      "Poison",
      "Flying",
      "Bug",
      "Ghost",
      "Dark"
    ],
    "prev_evolution": [{
      "num": "102",
      "name": "Exeggcute"
    }]
  }, {
    "id": 104,
    "num": "104",
    "name": "Cubone",
    "img": "http://www.serebii.net/pokemongo/pokemon/104.png",
    "type": [
      "Ground"
    ],
    "height": "0.41 m",
    "weight": "6.5 kg",
    "candy": "Cubone Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.61,
    "avg_spawns": 61,
    "spawn_time": "01:51",
    "multipliers": [1.67],
    "weaknesses": [
      "Water",
      "Grass",
      "Ice"
    ],
    "next_evolution": [{
      "num": "105",
      "name": "Marowak"
    }]
  }, {
    "id": 105,
    "num": "105",
    "name": "Marowak",
    "img": "http://www.serebii.net/pokemongo/pokemon/105.png",
    "type": [
      "Ground"
    ],
    "height": "0.99 m",
    "weight": "45.0 kg",
    "candy": "Cubone Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.02,
    "avg_spawns": 2,
    "spawn_time": "03:59",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Grass",
      "Ice"
    ],
    "prev_evolution": [{
      "num": "104",
      "name": "Cubone"
    }]
  }, {
    "id": 106,
    "num": "106",
    "name": "Hitmonlee",
    "img": "http://www.serebii.net/pokemongo/pokemon/106.png",
    "type": [
      "Fighting"
    ],
    "height": "1.50 m",
    "weight": "49.8 kg",
    "candy": "None",
    "egg": "10 km",
    "spawn_chance": 0.02,
    "avg_spawns": 2,
    "spawn_time": "03:59",
    "multipliers": null,
    "weaknesses": [
      "Flying",
      "Psychic",
      "Fairy"
    ]
  }, {
    "id": 107,
    "num": "107",
    "name": "Hitmonchan",
    "img": "http://www.serebii.net/pokemongo/pokemon/107.png",
    "type": [
      "Fighting"
    ],
    "height": "1.40 m",
    "weight": "50.2 kg",
    "candy": "None",
    "egg": "10 km",
    "spawn_chance": 0.022,
    "avg_spawns": 2.2,
    "spawn_time": "05:58",
    "multipliers": null,
    "weaknesses": [
      "Flying",
      "Psychic",
      "Fairy"
    ]
  }, {
    "id": 108,
    "num": "108",
    "name": "Lickitung",
    "img": "http://www.serebii.net/pokemongo/pokemon/108.png",
    "type": [
      "Normal"
    ],
    "height": "1.19 m",
    "weight": "65.5 kg",
    "candy": "None",
    "egg": "5 km",
    "spawn_chance": 0.011,
    "avg_spawns": 1.1,
    "spawn_time": "02:46",
    "multipliers": null,
    "weaknesses": [
      "Fighting"
    ]
  }, {
    "id": 109,
    "num": "109",
    "name": "Koffing",
    "img": "http://www.serebii.net/pokemongo/pokemon/109.png",
    "type": [
      "Poison"
    ],
    "height": "0.61 m",
    "weight": "1.0 kg",
    "candy": "Koffing Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.20,
    "avg_spawns": 20,
    "spawn_time": "08:16",
    "multipliers": [1.11],
    "weaknesses": [
      "Ground",
      "Psychic"
    ],
    "next_evolution": [{
      "num": "110",
      "name": "Weezing"
    }]
  }, {
    "id": 110,
    "num": "110",
    "name": "Weezing",
    "img": "http://www.serebii.net/pokemongo/pokemon/110.png",
    "type": [
      "Poison"
    ],
    "height": "1.19 m",
    "weight": "9.5 kg",
    "candy": "Koffing Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.016,
    "avg_spawns": 1.6,
    "spawn_time": "12:17",
    "multipliers": null,
    "weaknesses": [
      "Ground",
      "Psychic"
    ],
    "prev_evolution": [{
      "num": "109",
      "name": "Koffing"
    }]
  }, {
    "id": 111,
    "num": "111",
    "name": "Rhyhorn",
    "img": "http://www.serebii.net/pokemongo/pokemon/111.png",
    "type": [
      "Ground",
      "Rock"
    ],
    "height": "0.99 m",
    "weight": "115.0 kg",
    "candy": "Rhyhorn Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 0.63,
    "avg_spawns": 63,
    "spawn_time": "03:21",
    "multipliers": [1.91],
    "weaknesses": [
      "Water",
      "Grass",
      "Ice",
      "Fighting",
      "Ground",
      "Steel"
    ],
    "next_evolution": [{
      "num": "112",
      "name": "Rhydon"
    }]
  }, {
    "id": 112,
    "num": "112",
    "name": "Rhydon",
    "img": "http://www.serebii.net/pokemongo/pokemon/112.png",
    "type": [
      "Ground",
      "Rock"
    ],
    "height": "1.91 m",
    "weight": "120.0 kg",
    "candy": "Rhyhorn Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.022,
    "avg_spawns": 2.2,
    "spawn_time": "05:50",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Grass",
      "Ice",
      "Fighting",
      "Ground",
      "Steel"
    ],
    "prev_evolution": [{
      "num": "111",
      "name": "Rhyhorn"
    }]
  }, {
    "id": 113,
    "num": "113",
    "name": "Chansey",
    "img": "http://www.serebii.net/pokemongo/pokemon/113.png",
    "type": [
      "Normal"
    ],
    "height": "1.09 m",
    "weight": "34.6 kg",
    "candy": "None",
    "egg": "10 km",
    "spawn_chance": 0.013,
    "avg_spawns": 1.3,
    "spawn_time": "04:46",
    "multipliers": null,
    "weaknesses": [
      "Fighting"
    ]
  }, {
    "id": 114,
    "num": "114",
    "name": "Tangela",
    "img": "http://www.serebii.net/pokemongo/pokemon/114.png",
    "type": [
      "Grass"
    ],
    "height": "0.99 m",
    "weight": "35.0 kg",
    "candy": "None",
    "egg": "5 km",
    "spawn_chance": 0.228,
    "avg_spawns": 22.8,
    "spawn_time": "23:13",
    "multipliers": null,
    "weaknesses": [
      "Fire",
      "Ice",
      "Poison",
      "Flying",
      "Bug"
    ]
  }, {
    "id": 115,
    "num": "115",
    "name": "Kangaskhan",
    "img": "http://www.serebii.net/pokemongo/pokemon/115.png",
    "type": [
      "Normal"
    ],
    "height": "2.21 m",
    "weight": "80.0 kg",
    "candy": "None",
    "egg": "5 km",
    "spawn_chance": 0.0086,
    "avg_spawns": 0.86,
    "spawn_time": "02:40",
    "multipliers": null,
    "weaknesses": [
      "Fighting"
    ]
  }, {
    "id": 116,
    "num": "116",
    "name": "Horsea",
    "img": "http://www.serebii.net/pokemongo/pokemon/116.png",
    "type": [
      "Water"
    ],
    "height": "0.41 m",
    "weight": "8.0 kg",
    "candy": "Horsea Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 1.13,
    "avg_spawns": 113,
    "spawn_time": "02:53",
    "multipliers": [2.23],
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "next_evolution": [{
      "num": "117",
      "name": "Seadra"
    }]
  }, {
    "id": 117,
    "num": "117",
    "name": "Seadra",
    "img": "http://www.serebii.net/pokemongo/pokemon/117.png",
    "type": [
      "Water"
    ],
    "height": "1.19 m",
    "weight": "25.0 kg",
    "candy": "Horsea Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.034,
    "avg_spawns": 3.4,
    "spawn_time": "03:18",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "prev_evolution": [{
      "num": "116",
      "name": "Horsea"
    }]
  }, {
    "id": 118,
    "num": "118",
    "name": "Goldeen",
    "img": "http://www.serebii.net/pokemongo/pokemon/118.png",
    "type": [
      "Water"
    ],
    "height": "0.61 m",
    "weight": "15.0 kg",
    "candy": "Goldeen Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 2.18,
    "avg_spawns": 218,
    "spawn_time": "03:14",
    "multipliers": [
      2.15,
      2.2
    ],
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "next_evolution": [{
      "num": "119",
      "name": "Seaking"
    }]
  }, {
    "id": 119,
    "num": "119",
    "name": "Seaking",
    "img": "http://www.serebii.net/pokemongo/pokemon/119.png",
    "type": [
      "Water"
    ],
    "height": "1.30 m",
    "weight": "39.0 kg",
    "candy": "Goldeen Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.08,
    "avg_spawns": 8,
    "spawn_time": "05:21",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "prev_evolution": [{
      "num": "118",
      "name": "Goldeen"
    }]
  }, {
    "id": 120,
    "num": "120",
    "name": "Staryu",
    "img": "http://www.serebii.net/pokemongo/pokemon/120.png",
    "type": [
      "Water"
    ],
    "height": "0.79 m",
    "weight": "34.5 kg",
    "candy": "Staryu Candy",
    "candy_count": 50,
    "egg": "5 km",
    "spawn_chance": 1.95,
    "avg_spawns": 195,
    "spawn_time": "22:59",
    "multipliers": [
      2.38,
      2.41
    ],
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "next_evolution": [{
      "num": "121",
      "name": "Starmie"
    }]
  }, {
    "id": 121,
    "num": "121",
    "name": "Starmie",
    "img": "http://www.serebii.net/pokemongo/pokemon/121.png",
    "type": [
      "Water",
      "Psychic"
    ],
    "height": "1.09 m",
    "weight": "80.0 kg",
    "candy": "Staryu Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.034,
    "avg_spawns": 3.4,
    "spawn_time": "06:57",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Grass",
      "Bug",
      "Ghost",
      "Dark"
    ],
    "prev_evolution": [{
      "num": "120",
      "name": "Staryu"
    }]
  }, {
    "id": 122,
    "num": "122",
    "name": "Mr. Mime",
    "img": "http://www.serebii.net/pokemongo/pokemon/122.png",
    "type": [
      "Psychic"
    ],
    "height": "1.30 m",
    "weight": "54.5 kg",
    "candy": "None",
    "egg": "10 km",
    "spawn_chance": 0.0031,
    "avg_spawns": 0.31,
    "spawn_time": "01:51",
    "multipliers": null,
    "weaknesses": [
      "Bug",
      "Ghost",
      "Dark"
    ]
  }, {
    "id": 123,
    "num": "123",
    "name": "Scyther",
    "img": "http://www.serebii.net/pokemongo/pokemon/123.png",
    "type": [
      "Bug",
      "Flying"
    ],
    "height": "1.50 m",
    "weight": "56.0 kg",
    "candy": "None",
    "egg": "10 km",
    "spawn_chance": 0.14,
    "avg_spawns": 14,
    "spawn_time": "05:43",
    "multipliers": null,
    "weaknesses": [
      "Fire",
      "Electric",
      "Ice",
      "Flying",
      "Rock"
    ]
  }, {
    "id": 124,
    "num": "124",
    "name": "Jynx",
    "img": "http://www.serebii.net/pokemongo/pokemon/124.png",
    "type": [
      "Ice",
      "Psychic"
    ],
    "height": "1.40 m",
    "weight": "40.6 kg",
    "candy": "None",
    "egg": "10 km",
    "spawn_chance": 0.35,
    "avg_spawns": 35,
    "spawn_time": "05:41",
    "multipliers": null,
    "weaknesses": [
      "Fire",
      "Bug",
      "Rock",
      "Ghost",
      "Dark",
      "Steel"
    ]
  }, {
    "id": 125,
    "num": "125",
    "name": "Electabuzz",
    "img": "http://www.serebii.net/pokemongo/pokemon/125.png",
    "type": [
      "Electric"
    ],
    "height": "1.09 m",
    "weight": "30.0 kg",
    "candy": "None",
    "egg": "10 km",
    "spawn_chance": 0.074,
    "avg_spawns": 7.4,
    "spawn_time": "04:28",
    "multipliers": null,
    "weaknesses": [
      "Ground"
    ]
  }, {
    "id": 126,
    "num": "126",
    "name": "Magmar",
    "img": "http://www.serebii.net/pokemongo/pokemon/126.png",
    "type": [
      "Fire"
    ],
    "height": "1.30 m",
    "weight": "44.5 kg",
    "candy": "None",
    "egg": "10 km",
    "spawn_chance": 0.10,
    "avg_spawns": 10,
    "spawn_time": "20:36",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Ground",
      "Rock"
    ]
  }, {
    "id": 127,
    "num": "127",
    "name": "Pinsir",
    "img": "http://www.serebii.net/pokemongo/pokemon/127.png",
    "type": [
      "Bug"
    ],
    "height": "1.50 m",
    "weight": "55.0 kg",
    "candy": "None",
    "egg": "10 km",
    "spawn_chance": 0.99,
    "avg_spawns": 99,
    "spawn_time": "03:25",
    "multipliers": null,
    "weaknesses": [
      "Fire",
      "Flying",
      "Rock"
    ]
  }, {
    "id": 128,
    "num": "128",
    "name": "Tauros",
    "img": "http://www.serebii.net/pokemongo/pokemon/128.png",
    "type": [
      "Normal"
    ],
    "height": "1.40 m",
    "weight": "88.4 kg",
    "candy": "None",
    "egg": "5 km",
    "spawn_chance": 0.12,
    "avg_spawns": 12,
    "spawn_time": "00:37",
    "multipliers": null,
    "weaknesses": [
      "Fighting"
    ]
  }, {
    "id": 129,
    "num": "129",
    "name": "Magikarp",
    "img": "http://www.serebii.net/pokemongo/pokemon/129.png",
    "type": [
      "Water"
    ],
    "height": "0.89 m",
    "weight": "10.0 kg",
    "candy": "Magikarp Candy",
    "candy_count": 400,
    "egg": "2 km",
    "spawn_chance": 4.78,
    "avg_spawns": 478,
    "spawn_time": "14:26",
    "multipliers": [
      10.1,
      11.8
    ],
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "next_evolution": [{
      "num": "130",
      "name": "Gyarados"
    }]
  }, {
    "id": 130,
    "num": "130",
    "name": "Gyarados",
    "img": "http://www.serebii.net/pokemongo/pokemon/130.png",
    "type": [
      "Water",
      "Flying"
    ],
    "height": "6.50 m",
    "weight": "235.0 kg",
    "candy": "Magikarp Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.0032,
    "avg_spawns": 0.32,
    "spawn_time": "02:15",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "129",
      "name": "Magikarp"
    }]
  }, {
    "id": 131,
    "num": "131",
    "name": "Lapras",
    "img": "http://www.serebii.net/pokemongo/pokemon/131.png",
    "type": [
      "Water",
      "Ice"
    ],
    "height": "2.49 m",
    "weight": "220.0 kg",
    "candy": "None",
    "egg": "10 km",
    "spawn_chance": 0.006,
    "avg_spawns": 0.6,
    "spawn_time": "08:59",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Grass",
      "Fighting",
      "Rock"
    ]
  }, {
    "id": 132,
    "num": "132",
    "name": "Ditto",
    "img": "http://www.serebii.net/pokemongo/pokemon/132.png",
    "type": [
      "Normal"
    ],
    "height": "0.30 m",
    "weight": "4.0 kg",
    "candy": "None",
    "egg": "Not in Eggs",
    "spawn_chance": 0,
    "avg_spawns": 0,
    "spawn_time": "N/A",
    "multipliers": null,
    "weaknesses": [
      "Fighting"
    ]
  }, {
    "id": 133,
    "num": "133",
    "name": "Eevee",
    "img": "http://www.serebii.net/pokemongo/pokemon/133.png",
    "type": [
      "Normal"
    ],
    "height": "0.30 m",
    "weight": "6.5 kg",
    "candy": "Eevee Candy",
    "candy_count": 25,
    "egg": "10 km",
    "spawn_chance": 2.75,
    "avg_spawns": 275,
    "spawn_time": "05:32",
    "multipliers": [
      2.02,
      2.64
    ],
    "weaknesses": [
      "Fighting"
    ],
    "next_evolution": [{
      "num": "134",
      "name": "Vaporeon"
    }, {
      "num": "135",
      "name": "Jolteon"
    }, {
      "num": "136",
      "name": "Flareon"
    }]
  }, {
    "id": 134,
    "num": "134",
    "name": "Vaporeon",
    "img": "http://www.serebii.net/pokemongo/pokemon/134.png",
    "type": [
      "Water"
    ],
    "height": "0.99 m",
    "weight": "29.0 kg",
    "candy": "Eevee Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.014,
    "avg_spawns": 1.4,
    "spawn_time": "10:54",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Grass"
    ],
    "prev_evolution": [{
      "num": "133",
      "name": "Eevee"
    }]
  }, {
    "id": 135,
    "num": "135",
    "name": "Jolteon",
    "img": "http://www.serebii.net/pokemongo/pokemon/135.png",
    "type": [
      "Electric"
    ],
    "height": "0.79 m",
    "weight": "24.5 kg",
    "candy": "None",
    "egg": "Not in Eggs",
    "spawn_chance": 0.012,
    "avg_spawns": 1.2,
    "spawn_time": "02:30",
    "multipliers": null,
    "weaknesses": [
      "Ground"
    ],
    "prev_evolution": [{
      "num": "133",
      "name": "Eevee"
    }]
  }, {
    "id": 136,
    "num": "136",
    "name": "Flareon",
    "img": "http://www.serebii.net/pokemongo/pokemon/136.png",
    "type": [
      "Fire"
    ],
    "height": "0.89 m",
    "weight": "25.0 kg",
    "candy": "Eevee Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.017,
    "avg_spawns": 1.7,
    "spawn_time": "07:02",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Ground",
      "Rock"
    ],
    "prev_evolution": [{
      "num": "133",
      "name": "Eevee"
    }]
  }, {
    "id": 137,
    "num": "137",
    "name": "Porygon",
    "img": "http://www.serebii.net/pokemongo/pokemon/137.png",
    "type": [
      "Normal"
    ],
    "height": "0.79 m",
    "weight": "36.5 kg",
    "candy": "None",
    "egg": "5 km",
    "spawn_chance": 0.012,
    "avg_spawns": 1.2,
    "spawn_time": "02:49",
    "multipliers": null,
    "weaknesses": [
      "Fighting"
    ]
  }, {
    "id": 138,
    "num": "138",
    "name": "Omanyte",
    "img": "http://www.serebii.net/pokemongo/pokemon/138.png",
    "type": [
      "Rock",
      "Water"
    ],
    "height": "0.41 m",
    "weight": "7.5 kg",
    "candy": "Omanyte Candy",
    "candy_count": 50,
    "egg": "10 km",
    "spawn_chance": 0.14,
    "avg_spawns": 14,
    "spawn_time": "10:23",
    "multipliers": [2.12],
    "weaknesses": [
      "Electric",
      "Grass",
      "Fighting",
      "Ground"
    ],
    "next_evolution": [{
      "num": "139",
      "name": "Omastar"
    }]
  }, {
    "id": 139,
    "num": "139",
    "name": "Omastar",
    "img": "http://www.serebii.net/pokemongo/pokemon/139.png",
    "type": [
      "Rock",
      "Water"
    ],
    "height": "0.99 m",
    "weight": "35.0 kg",
    "candy": "None",
    "egg": "Omanyte Candy",
    "spawn_chance": 0.0061,
    "avg_spawns": 0.61,
    "spawn_time": "05:04",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Grass",
      "Fighting",
      "Ground"
    ],
    "prev_evolution": [{
      "num": "138",
      "name": "Omanyte"
    }]
  }, {
    "id": 140,
    "num": "140",
    "name": "Kabuto",
    "img": "http://www.serebii.net/pokemongo/pokemon/140.png",
    "type": [
      "Rock",
      "Water"
    ],
    "height": "0.51 m",
    "weight": "11.5 kg",
    "candy": "Kabuto Candy",
    "candy_count": 50,
    "egg": "10 km",
    "spawn_chance": 0.10,
    "avg_spawns": 10,
    "spawn_time": "00:05",
    "multipliers": [
      1.97,
      2.37
    ],
    "weaknesses": [
      "Electric",
      "Grass",
      "Fighting",
      "Ground"
    ],
    "next_evolution": [{
      "num": "141",
      "name": "Kabutops"
    }]
  }, {
    "id": 141,
    "num": "141",
    "name": "Kabutops",
    "img": "http://www.serebii.net/pokemongo/pokemon/141.png",
    "type": [
      "Rock",
      "Water"
    ],
    "height": "1.30 m",
    "weight": "40.5 kg",
    "candy": "Kabuto Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.0032,
    "avg_spawns": 0.32,
    "spawn_time": "23:40",
    "multipliers": null,
    "weaknesses": [
      "Electric",
      "Grass",
      "Fighting",
      "Ground"
    ],
    "prev_evolution": [{
      "num": "140",
      "name": "Kabuto"
    }]
  }, {
    "id": 142,
    "num": "142",
    "name": "Aerodactyl",
    "img": "http://www.serebii.net/pokemongo/pokemon/142.png",
    "type": [
      "Rock",
      "Flying"
    ],
    "height": "1.80 m",
    "weight": "59.0 kg",
    "candy": "None",
    "egg": "10 km",
    "spawn_chance": 0.018,
    "avg_spawns": 1.8,
    "spawn_time": "23:40",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Electric",
      "Ice",
      "Rock",
      "Steel"
    ]
  }, {
    "id": 143,
    "num": "143",
    "name": "Snorlax",
    "img": "http://www.serebii.net/pokemongo/pokemon/143.png",
    "type": [
      "Normal"
    ],
    "height": "2.11 m",
    "weight": "460.0 kg",
    "candy": "None",
    "egg": "10 km",
    "spawn_chance": 0.016,
    "avg_spawns": 1.6,
    "spawn_time": "23:40",
    "multipliers": null,
    "weaknesses": [
      "Fighting"
    ]
  }, {
    "id": 144,
    "num": "144",
    "name": "Articuno",
    "img": "http://www.serebii.net/pokemongo/pokemon/144.png",
    "type": [
      "Ice",
      "Flying"
    ],
    "height": "1.70 m",
    "weight": "55.4 kg",
    "candy": "None",
    "egg": "Not in Eggs",
    "spawn_chance": 0,
    "avg_spawns": 0,
    "spawn_time": "N/A",
    "multipliers": null,
    "weaknesses": [
      "Fire",
      "Electric",
      "Rock",
      "Steel"
    ]
  }, {
    "id": 145,
    "num": "145",
    "name": "Zapdos",
    "img": "http://www.serebii.net/pokemongo/pokemon/145.png",
    "type": [
      "Electric",
      "Flying"
    ],
    "height": "1.60 m",
    "weight": "52.6 kg",
    "candy": "None",
    "egg": "Not in Eggs",
    "spawn_chance": 0,
    "avg_spawns": 0,
    "spawn_time": "N/A",
    "multipliers": null,
    "weaknesses": [
      "Ice",
      "Rock"
    ]
  }, {
    "id": 146,
    "num": "146",
    "name": "Moltres",
    "img": "http://www.serebii.net/pokemongo/pokemon/146.png",
    "type": [
      "Fire",
      "Flying"
    ],
    "height": "2.01 m",
    "weight": "60.0 kg",
    "candy": "None",
    "egg": "Not in Eggs",
    "spawn_chance": 0,
    "avg_spawns": 0,
    "spawn_time": "N/A",
    "multipliers": null,
    "weaknesses": [
      "Water",
      "Electric",
      "Rock"
    ]
  }, {
    "id": 147,
    "num": "147",
    "name": "Dratini",
    "img": "http://www.serebii.net/pokemongo/pokemon/147.png",
    "type": [
      "Dragon"
    ],
    "height": "1.80 m",
    "weight": "3.3 kg",
    "candy": "Dratini Candy",
    "candy_count": 25,
    "egg": "10 km",
    "spawn_chance": 0.30,
    "avg_spawns": 30,
    "spawn_time": "06:41",
    "multipliers": [
      1.83,
      1.84
    ],
    "weaknesses": [
      "Ice",
      "Dragon",
      "Fairy"
    ],
    "next_evolution": [{
      "num": "148",
      "name": "Dragonair"
    }, {
      "num": "149",
      "name": "Dragonite"
    }]
  }, {
    "id": 148,
    "num": "148",
    "name": "Dragonair",
    "img": "http://www.serebii.net/pokemongo/pokemon/148.png",
    "type": [
      "Dragon"
    ],
    "height": "3.99 m",
    "weight": "16.5 kg",
    "candy": "Dratini Candy",
    "candy_count": 100,
    "egg": "Not in Eggs",
    "spawn_chance": 0.02,
    "avg_spawns": 2,
    "spawn_time": "11:57",
    "multipliers": [2.05],
    "weaknesses": [
      "Ice",
      "Dragon",
      "Fairy"
    ],
    "prev_evolution": [{
      "num": "147",
      "name": "Dratini"
    }],
    "next_evolution": [{
      "num": "149",
      "name": "Dragonite"
    }]
  }, {
    "id": 149,
    "num": "149",
    "name": "Dragonite",
    "img": "http://www.serebii.net/pokemongo/pokemon/149.png",
    "type": [
      "Dragon",
      "Flying"
    ],
    "height": "2.21 m",
    "weight": "210.0 kg",
    "candy": "Dratini Candy",
    "egg": "Not in Eggs",
    "spawn_chance": 0.0011,
    "avg_spawns": 0.11,
    "spawn_time": "23:38",
    "multipliers": null,
    "weaknesses": [
      "Ice",
      "Rock",
      "Dragon",
      "Fairy"
    ],
    "prev_evolution": [{
      "num": "147",
      "name": "Dratini"
    }, {
      "num": "148",
      "name": "Dragonair"
    }]
  }, {
    "id": 150,
    "num": "150",
    "name": "Mewtwo",
    "img": "http://www.serebii.net/pokemongo/pokemon/150.png",
    "type": [
      "Psychic"
    ],
    "height": "2.01 m",
    "weight": "122.0 kg",
    "candy": "None",
    "egg": "Not in Eggs",
    "spawn_chance": 0,
    "avg_spawns": 0,
    "spawn_time": "N/A",
    "multipliers": null,
    "weaknesses": [
      "Bug",
      "Ghost",
      "Dark"
    ]
  }, {
    "id": 151,
    "num": "151",
    "name": "Mew",
    "img": "http://www.serebii.net/pokemongo/pokemon/151.png",
    "type": [
      "Psychic"
    ],
    "height": "0.41 m",
    "weight": "4.0 kg",
    "candy": "None",
    "egg": "Not in Eggs",
    "spawn_chance": 0,
    "avg_spawns": 0,
    "spawn_time": "N/A",
    "multipliers": null,
    "weaknesses": [
      "Bug",
      "Ghost",
      "Dark"
    ]
  }]
}

Ce n’est évidemment pas impossible, mais cela donne un fichier assez ilisible et complexe à maintenir.

Une configmap en HCL

Maintenant.. l’avantage de Terraform est de pouvoir séparer le manifest des données.

resource "kubernetes_config_map" "data_user" {
  metadata {
    name      = "data-user"
    namespace = "hcl"
  }

  data = {
    "data.ini" = "${file("${path.module}/data.ini")}"
  }
}

Le HCL n’a rien à envier du YAML de Kubernetes.

Et concernant un déploiement ?

Dans un bon écosystème, nous déployons via Helm, voyons comment Hashicorp nous présente ça.

Information

Helm est un outil de templating YAML similaire à Jinja2, on l’utilise dans les déploiements nécéssitant de nombreux fichiers YAML (service, deploy, pvc, scaler…)

Hashicorp propose également un module Helm :

variable "if_clusterenabled" {
  type = string
  default = "true"
}


resource "helm_release" "redisexample" {
  name       = "my-redis-release"
  repository = "https://charts.bitnami.com/bitnami"
  chart      = "redis"
  version    = "17.3.9"
  namespace  = "hcl"

  values = [
    "${file("values.yaml")}"
  ]

  set {
    name  = "cluster.enabled"
    value = var.if_clusterenabled
  }

  set {
    name  = "metrics.enabled"
    value = "true"
  }

}

asciicast

Dans ce cas là, je peux injecter les variables:

  • provenants du fichier values.yaml
  • présentes dans le fichier terraform

Comme dit dans l’introduction de cet article : la force de terraform vient de ses providers, il est donc possible de récupérer des variables depuis un serveur Vault, un bitwarden, ou même un KeePass.

k2tf - Migrer ses yaml vers Terraform

Histoire de convaincre les flemmards, voici un projet Github permettant de convertir ses fichiers YAML vers des fichiers Terraform. Les fichiers générés n’ont besoin que d’un provider.tf avant de pouvoir être déployés.

asciicast

Conclusion

Le HCL apporte de nombreux avantages dans l’administration d’un cluster Kubernetes. En intégrant les modules Terraform,on se soustrait d’une configuration statique sans alourdir le cluster. (par exemple,l’usage des initPods qui peuvent être utilisés pour récupérer du contenu stocké ailleurs alors que Terraform peut le faire durant le déploiement). J’ai hâte de voir comment Terraform et Kubernetes fonctionneront à l’avenir, et quelles intégrations seront possibles.

Avertissement

Mais pour vous ouvrir d’autres possibilités et vous débarasser d’un DSL, il existe un outil bien pratique nommé Pulumi qui permet de faire les mêmes choses que Terraform depuis un réel langage de programmation comme le Python, le Go, le Java etc…

Merci de votre lecture!