Add registry_tool host_create command

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130953679
This commit is contained in:
mcilwain 2016-08-22 10:30:26 -07:00 committed by Ben McIlwain
parent 91f8b6da38
commit 965cf6edc3
6 changed files with 204 additions and 0 deletions

View file

@ -0,0 +1,76 @@
// Copyright 2016 The Domain Registry Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.tools;
import static google.registry.util.CollectionUtils.nullToEmpty;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
import com.google.common.collect.ImmutableList;
import com.google.common.net.InetAddresses;
import com.google.template.soy.data.SoyMapData;
import google.registry.tools.Command.GtechCommand;
import google.registry.tools.soy.HostCreateSoyInfo;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.util.List;
/** A command to create a new host via EPP. */
@Parameters(separators = " =", commandDescription = "Create a new host via EPP.")
final class CreateHostCommand extends MutatingEppToolCommand implements GtechCommand {
@Parameter(
names = {"-c", "--client"},
description = "Client identifier of the registrar to execute the command as.",
required = true)
String clientIdentifier;
@Parameter(
names = "--host",
description = "Host name.",
required = true)
private String hostName;
@Parameter(
names = {"-a", "--addresses"},
description = "List of addresses in IPv4 and/or IPv6 format.",
variableArity = true)
private List<String> addresses;
@Override
protected void initMutatingEppToolCommand() {
setSoyTemplate(HostCreateSoyInfo.getInstance(), HostCreateSoyInfo.HOSTCREATE);
ImmutableList.Builder<String> ipv4Addresses = new ImmutableList.Builder<>();
ImmutableList.Builder<String> ipv6Addresses = new ImmutableList.Builder<>();
for (String address : nullToEmpty(addresses)) {
InetAddress inetAddress = InetAddresses.forString(address);
if (inetAddress instanceof Inet4Address) {
ipv4Addresses.add(inetAddress.getHostAddress());
} else if (inetAddress instanceof Inet6Address) {
ipv6Addresses.add(inetAddress.getHostAddress());
} else {
throw new IllegalArgumentException(
String.format("IP address in unknown format: %s", address));
}
}
addSoyRecord(
clientIdentifier,
new SoyMapData(
"hostname", hostName,
"ipv4addresses", ipv4Addresses.build(),
"ipv6addresses", ipv6Addresses.build()));
}
}

View file

@ -37,6 +37,7 @@ public final class GtechTool {
.put("create_credit", CreateCreditCommand.class) .put("create_credit", CreateCreditCommand.class)
.put("create_credit_balance", CreateCreditBalanceCommand.class) .put("create_credit_balance", CreateCreditBalanceCommand.class)
.put("create_domain", CreateDomainCommand.class) .put("create_domain", CreateDomainCommand.class)
.put("create_host", CreateHostCommand.class)
.put("create_registrar_groups", CreateRegistrarGroupsCommand.class) .put("create_registrar_groups", CreateRegistrarGroupsCommand.class)
.put("create_registrar", CreateRegistrarCommand.class) .put("create_registrar", CreateRegistrarCommand.class)
.put("create_sandbox_tld", CreateSandboxTldCommand.class) .put("create_sandbox_tld", CreateSandboxTldCommand.class)

View file

@ -0,0 +1,45 @@
// Copyright 2016 The Domain Registry Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
{namespace domain.registry.tools autoescape="strict"}
/**
* Create host
*/
{template .hostcreate}
{@param hostname: string}
{@param? ipv4addresses: list<string>}
{@param? ipv6addresses: list<string>}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<create>
<host:create xmlns:host="urn:ietf:params:xml:ns:host-1.0">
<host:name>{$hostname}</host:name>
{if $ipv4addresses}
{foreach $ipv4 in $ipv4addresses}
<host:addr ip="v4">{$ipv4}</host:addr>
{/foreach}
{/if}
{if $ipv6addresses}
{foreach $ipv6 in $ipv6addresses}
<host:addr ip="v6">{$ipv6}</host:addr>
{/foreach}
{/if}
</host:create>
</create>
<clTRID>GTechTool</clTRID>
</command>
</epp>
{/template}

View file

@ -0,0 +1,59 @@
// Copyright 2016 The Domain Registry Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.tools;
import static google.registry.testing.DatastoreHelper.createTld;
import com.beust.jcommander.ParameterException;
import org.junit.Test;
/** Unit tests for {@link CreateHostCommand}. */
public class CreateHostCommandTest extends EppToolCommandTestCase<CreateHostCommand> {
@Test
public void testSuccess_complete() throws Exception {
createTld("tld");
runCommandForced(
"--client=NewRegistrar",
"--host=example.tld",
"--addresses=162.100.102.99,2001:0db8:85a3:0000:0000:8a2e:0370:7334,4.5.6.7");
eppVerifier().verifySent("host_create_complete.xml");
}
@Test
public void testSuccess_minimal() throws Exception {
// Test that each optional field can be omitted.
runCommandForced(
"--client=NewRegistrar",
"--host=notours.external");
eppVerifier().verifySent("host_create_minimal.xml");
}
@Test
public void testFailure_missingHost() throws Exception {
thrown.expect(ParameterException.class);
runCommandForced("--client=NewRegistrar");
}
@Test
public void testFailure_invalidIpAddress() throws Exception {
createTld("tld");
thrown.expect(IllegalArgumentException.class, "'a.b.c.d' is not an IP string literal.");
runCommandForced(
"--client=NewRegistrar",
"--host=example.tld",
"--addresses=a.b.c.d");
}
}

View file

@ -0,0 +1,13 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<create>
<host:create xmlns:host="urn:ietf:params:xml:ns:host-1.0">
<host:name>example.tld</host:name>
<host:addr ip="v4">162.100.102.99</host:addr>
<host:addr ip="v4">4.5.6.7</host:addr>
<host:addr ip="v6">2001:0db8:85a3:0000:0000:8a2e:0370:7334</host:addr>
</host:create>
</create>
<clTRID>GTechTool</clTRID>
</command>
</epp>

View file

@ -0,0 +1,10 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<command>
<create>
<host:create xmlns:host="urn:ietf:params:xml:ns:host-1.0">
<host:name>notours.external</host:name>
</host:create>
</create>
<clTRID>GTechTool</clTRID>
</command>
</epp>