## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The goal is to maximize the number of seasonings and spices that can be stored by buying small and large cabinets, given constraints on space and budget.

Let's define the decision variables:
- \(x\): The number of small cabinets to buy.
- \(y\): The number of large cabinets to buy.

The objective function to maximize is:
\[ 30x + 40y \]

Subject to the constraints:
1. Space constraint: \( 4x + 8y \leq 200 \)
2. Budget constraint: \( 70x + 120y \leq 1400 \)
3. Non-negativity constraints: \( x \geq 0, y \geq 0 \)
4. Integer constraints: \( x \in \mathbb{Z}, y \in \mathbb{Z} \) (though Gurobi can handle these, we note that for a fully MIP, we would need to explicitly state this, but for simplicity and given the problem's request, we proceed with continuous relaxation and then round if necessary).

## Gurobi Code

```python
import gurobi

def solve_cabinet_problem():
    # Create a new model
    model = gurobi.Model()

    # Define variables
    x = model.addVar(name="small_cabinets", lb=0, ub=gurobi.GRB.INFINITY, vtype=gurobi.GRB.INTEGER)
    y = model.addVar(name="large_cabinets", lb=0, ub=gurobi.GRB.INFINITY, vtype=gurobi.GRB.INTEGER)

    # Objective function: Maximize 30x + 40y
    model.setObjective(30*x + 40*y, gurobi.GRB.MAXIMIZE)

    # Space constraint: 4x + 8y <= 200
    model.addConstr(4*x + 8*y <= 200, name="space_constraint")

    # Budget constraint: 70x + 120y <= 1400
    model.addConstr(70*x + 120*y <= 1400, name="budget_constraint")

    # Solve the model
    model.optimize()

    if model.status == gurobi.GRB.Status.OPTIMAL:
        print(f"Optimal solution: x = {x.varValue}, y = {y.varValue}")
        print(f"Maximum seasonings and spices: {30*x.varValue + 40*y.varValue}")
    else:
        print("No optimal solution found")

solve_cabinet_problem()
```

This code directly translates the problem description into a Gurobi model, solving for the optimal number of small and large cabinets to buy. Note that while the problem formulation involves integer variables (as you can't buy a fraction of a cabinet), the code utilizes Gurobi's ability to solve mixed-integer programs (MIPs) by specifying `vtype=gurobi.GRB.INTEGER` for `x` and `y`. 

However, due to specific problem requirements or Gurobi configurations, adjustments might be necessary. This formulation assumes that an optimal integer solution can be found directly or that any continuous solution can be appropriately rounded to integers. For a strict MIP solution, further verification of optimality might be required.