public DropColumnFamily(String tableName, String cfName)
      throws ConfigurationException, IOException {
    super(
        UUIDGen.makeType1UUIDFromHost(FBUtilities.getLocalAddress()),
        DatabaseDescriptor.getDefsVersion());
    this.tableName = tableName;
    this.cfName = cfName;

    KSMetaData ksm = DatabaseDescriptor.getTableDefinition(tableName);
    if (ksm == null) throw new ConfigurationException("Keyspace does not already exist.");
    else if (!ksm.cfMetaData().containsKey(cfName))
      throw new ConfigurationException("CF is not defined in that keyspace.");

    KSMetaData newKsm = makeNewKeyspaceDefinition(ksm);
    rm = Migration.makeDefinitionMutation(newKsm, null, newVersion);
  }
  public AddColumnFamily(CFMetaData cfm) throws ConfigurationException, IOException {
    super(
        UUIDGen.makeType1UUIDFromHost(GossipUtilities.getLocalAddress()),
        NodeDescriptor.getDefsVersion());
    this.cfm = cfm;
    KSMetaData ksm = NodeDescriptor.getTableDefinition(cfm.ksName);

    if (ksm == null) throw new ConfigurationException("No such keyspace: " + cfm.ksName);
    else if (ksm.cfMetaData().containsKey(cfm.cfName))
      throw new ConfigurationException(
          String.format("%s already exists in keyspace %s", cfm.cfName, cfm.ksName));
    else if (!Migration.isLegalName(cfm.cfName))
      throw new ConfigurationException("Invalid column family name: " + cfm.cfName);
    for (Map.Entry<ByteBuffer, ColumnDefinition> entry : cfm.getColumn_metadata().entrySet()) {
      String indexName = entry.getValue().getIndexName();
      if (indexName != null && !Migration.isLegalName(indexName))
        throw new ConfigurationException("Invalid index name: " + indexName);
    }

    // clone ksm but include the new cf def.
    KSMetaData newKsm = makeNewKeyspaceDefinition(ksm);

    rm = Migration.makeDefinitionMutation(newKsm, null, newVersion);
  }