Skip to content

Commit

Permalink
[JENKINS-50204] Implemented the credentials page
Browse files Browse the repository at this point in the history
  • Loading branch information
agentgonzo committed Apr 12, 2018
1 parent 176376f commit d272a6e
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 4 deletions.
4 changes: 4 additions & 0 deletions pom.xml
Expand Up @@ -67,6 +67,10 @@
<id>teilo</id>
<name>James Nord</name>
</developer>
<developer>
<id>agentgonzo</id>
<name>Steve Arch</name>
</developer>
</developers>

<dependencyManagement>
Expand Down
Expand Up @@ -49,9 +49,12 @@
import hudson.init.TermMilestone;
import hudson.init.Terminator;
import hudson.model.ItemGroup;
import hudson.model.ModelObject;
import hudson.security.ACL;
import jenkins.model.Jenkins;
import com.cloudbees.plugins.credentials.Credentials;
import com.cloudbees.plugins.credentials.CredentialsProvider;
import com.cloudbees.plugins.credentials.CredentialsStore;
import com.cloudbees.plugins.credentials.common.IdCredentials;

@Extension
Expand All @@ -67,6 +70,8 @@ public class KubernetesCredentialProvider extends CredentialsProvider implements
@CheckForNull
private Watch watch;

private KubernetesCredentialsStore store = new KubernetesCredentialsStore(this);

@Initializer(after=InitMilestone.PLUGINS_PREPARED, fatal=false)
@Restricted(NoExternalUse.class) // only for callbacks from Jenkins
public void startWatchingForSecrets() {
Expand All @@ -92,15 +97,15 @@ public void startWatchingForSecrets() {
// XXX https://github.com/fabric8io/kubernetes-client/issues/1014
// watch(resourceVersion, watcher) is deprecated but there is nothing to say why?
client = _client;
LOG.log(Level.FINER, "regestering watch");
LOG.log(Level.FINER, "registering watch");
watch = _client.secrets().withLabel(SecretUtils.JENKINS_IO_CREDENTIALS_TYPE_LABEL).watch(list.getMetadata().getResourceVersion(), this);
LOG.log(Level.FINER, "registered watch, retreiving secrets");
LOG.log(Level.FINER, "registered watch, retrieving secrets");
} catch (KubernetesClientException kex) {
LOG.log(Level.SEVERE, "Failed to initialise k8s secret provider, secrets from Kubernetes will not be available", kex);
// TODO add an administrative warning to report this clearly to the admin
}
}


@Terminator(after=TermMilestone.STARTED)
@Restricted(NoExternalUse.class) // only for callbacks from Jenkins
Expand Down Expand Up @@ -195,11 +200,15 @@ IdCredentials convertSecret(Secret s) {
else {
LOG.log(Level.WARNING, "Failed to convert Secret ''{0}'' of type {1} due to {2}", new Object[] {SecretUtils.getCredentialId(s), type, ex.getMessage()});
}
return null;
return null;
}
}
LOG.log(Level.WARNING, "No SecretToCredentialConveror found to convert secrets of type {0}", type);
return null;
}

@Override
public CredentialsStore getStore(ModelObject object) {
return object == Jenkins.getInstance() ? store : null;
}
}
@@ -0,0 +1,58 @@
package com.cloudbees.jenkins.plugins.kubernetes_credentials_provider;

import java.io.IOException;
import java.util.List;
import edu.umd.cs.findbugs.annotations.NonNull;
import org.acegisecurity.Authentication;
import org.apache.commons.lang.NotImplementedException;
import hudson.model.ModelObject;
import hudson.security.ACL;
import hudson.security.Permission;
import jenkins.model.Jenkins;
import com.cloudbees.plugins.credentials.Credentials;
import com.cloudbees.plugins.credentials.CredentialsStore;
import com.cloudbees.plugins.credentials.domains.Domain;

public class KubernetesCredentialsStore extends CredentialsStore {

private final KubernetesCredentialProvider provider;

public KubernetesCredentialsStore(KubernetesCredentialProvider provider) {
super(KubernetesCredentialProvider.class);
this.provider = provider;
}

@NonNull
@Override
public ModelObject getContext() {
return Jenkins.getInstance();
}

@Override
public boolean hasPermission(@NonNull Authentication authentication, @NonNull Permission permission) {
return Jenkins.getInstance().getACL().hasPermission(authentication, permission);
}

@NonNull
@Override
public List<Credentials> getCredentials(@NonNull Domain domain) {
// TODO: Filter by domain - how do I do this?
return provider.getCredentials(Credentials.class, Jenkins.getInstance(), ACL.SYSTEM);
}

@Override
public boolean addCredentials(@NonNull Domain domain, @NonNull Credentials credentials) {
throw new NotImplementedException();
}

@Override
public boolean removeCredentials(@NonNull Domain domain, @NonNull Credentials credentials) {
throw new NotImplementedException();
}

@Override
public boolean updateCredentials(@NonNull Domain domain, @NonNull Credentials current,
@NonNull Credentials replacement) {
throw new NotImplementedException();
}
}

0 comments on commit d272a6e

Please sign in to comment.