FEniCS, pygmsh and boundary conditions

As you are using OpenCascade, and not the built in geometry in gmsh, the functionality of pygmsh is slightly reduced.
What you need to add in add_raw_code is the raw gmsh code describing the tags. In your case:

geom.add_raw_code("Physical Surface(1) = { 1 };")
geom.add_raw_code("Physical Surface(2) = {2,3,4,5,6,7};")

I found these surfaces by visual inspection in gmsh by writing the original geometry to file by:

pygmsh.generate_mesh(geom, geo_filename="mesh.geo")

To answer your second question, this is covered in: