blob: cfe5a45569374527ff4ad27384423ecb0fd23682 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.hadoop.yarn.security;
import org.apache.commons.io.FileUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DataOutputBuffer;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.security.Credentials;
import org.apache.hadoop.security.token.Token;
import org.apache.hadoop.security.token.TokenIdentifier;
import org.apache.hadoop.yarn.util.DockerClientConfigHandler;
import org.junit.Before;
import org.junit.Test;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.nio.ByteBuffer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Test the functionality of the DockerClientConfigHandler.
*/
public class TestDockerClientConfigHandler {
public static final String JSON = "{\"auths\": "
+ "{\"https://index.docker.io/v1/\": "
+ "{\"auth\": \"foobarbaz\"},"
+ "\"registry.example.com\": "
+ "{\"auth\": \"bazbarfoo\"}}}";
private static final String APPLICATION_ID = "application_2313_2131341";
private File file;
private Configuration conf = new Configuration();
@Before
public void setUp() throws Exception {
file = File.createTempFile("docker-client-config", "test");
file.deleteOnExit();
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
bw.write(JSON);
bw.close();
}
@Test
public void testReadCredentialsFromConfigFile() throws Exception {
Credentials credentials =
DockerClientConfigHandler.readCredentialsFromConfigFile(
new Path(file.toURI()), conf, APPLICATION_ID);
Token token1 = credentials.getToken(
new Text("https://index.docker.io/v1/-" + APPLICATION_ID));
assertEquals(DockerCredentialTokenIdentifier.KIND, token1.getKind());
assertEquals("foobarbaz", new String(token1.getPassword()));
DockerCredentialTokenIdentifier ti1 =
(DockerCredentialTokenIdentifier) token1.decodeIdentifier();
assertEquals("https://index.docker.io/v1/", ti1.getRegistryUrl());
assertEquals(APPLICATION_ID, ti1.getApplicationId());
Token token2 = credentials.getToken(
new Text("registry.example.com-" + APPLICATION_ID));
assertEquals(DockerCredentialTokenIdentifier.KIND, token2.getKind());
assertEquals("bazbarfoo", new String(token2.getPassword()));
DockerCredentialTokenIdentifier ti2 =
(DockerCredentialTokenIdentifier) token2.decodeIdentifier();
assertEquals("registry.example.com", ti2.getRegistryUrl());
assertEquals(APPLICATION_ID, ti2.getApplicationId());
}
@Test
public void testGetCredentialsFromTokensByteBuffer() throws Exception {
Credentials credentials =
DockerClientConfigHandler.readCredentialsFromConfigFile(
new Path(file.toURI()), conf, APPLICATION_ID);
DataOutputBuffer dob = new DataOutputBuffer();
credentials.writeTokenStorageToStream(dob);
ByteBuffer tokens = ByteBuffer.wrap(dob.getData(), 0, dob.getLength());
Credentials credentialsOut =
DockerClientConfigHandler.getCredentialsFromTokensByteBuffer(tokens);
assertEquals(credentials.numberOfTokens(), credentialsOut.numberOfTokens());
for (Token<? extends TokenIdentifier> tkIn : credentials.getAllTokens()) {
DockerCredentialTokenIdentifier ti =
(DockerCredentialTokenIdentifier) tkIn.decodeIdentifier();
Token tkOut = credentialsOut.getToken(
new Text(ti.getRegistryUrl() + "-" + ti.getApplicationId()));
assertEquals(tkIn.getKind(), tkOut.getKind());
assertEquals(new String(tkIn.getIdentifier()),
new String(tkOut.getIdentifier()));
assertEquals(new String(tkIn.getPassword()),
new String(tkOut.getPassword()));
assertEquals(tkIn.getService(), tkOut.getService());
}
}
@Test
public void testWriteDockerCredentialsToPath() throws Exception {
File outFile = File.createTempFile("docker-client-config", "out");
outFile.deleteOnExit();
Credentials credentials =
DockerClientConfigHandler.readCredentialsFromConfigFile(
new Path(file.toURI()), conf, APPLICATION_ID);
assertTrue(DockerClientConfigHandler.writeDockerCredentialsToPath(outFile,
credentials));
assertTrue(outFile.exists());
String fileContents = FileUtils.readFileToString(outFile);
assertTrue(fileContents.contains("auths"));
assertTrue(fileContents.contains("registry.example.com"));
assertTrue(fileContents.contains("https://index.docker.io/v1/"));
assertTrue(fileContents.contains("foobarbaz"));
assertTrue(fileContents.contains("bazbarfoo"));
}
}