1 /**
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements.  See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership.  The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License.  You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 package org.apache.hadoop.yarn.server.api.protocolrecords.impl.pb;
20 
21 import java.nio.ByteBuffer;
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.Iterator;
25 import java.util.List;
26 import java.util.Map;
27 
28 import org.apache.hadoop.yarn.api.records.ApplicationId;
29 import org.apache.hadoop.yarn.api.records.ContainerId;
30 import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationIdPBImpl;
31 import org.apache.hadoop.yarn.api.records.impl.pb.ContainerIdPBImpl;
32 import org.apache.hadoop.yarn.api.records.impl.pb.ProtoBase;
33 import org.apache.hadoop.yarn.api.records.impl.pb.ProtoUtils;
34 import org.apache.hadoop.yarn.proto.YarnProtos.ApplicationIdProto;
35 import org.apache.hadoop.yarn.proto.YarnProtos.ContainerIdProto;
36 import org.apache.hadoop.yarn.proto.YarnServerCommonProtos.MasterKeyProto;
37 import org.apache.hadoop.yarn.proto.YarnServerCommonProtos.NodeActionProto;
38 import org.apache.hadoop.yarn.proto.YarnServerCommonServiceProtos.NodeHeartbeatResponseProto;
39 import org.apache.hadoop.yarn.proto.YarnServerCommonServiceProtos.NodeHeartbeatResponseProtoOrBuilder;
40 import org.apache.hadoop.yarn.proto.YarnServerCommonServiceProtos.SystemCredentialsForAppsProto;
41 import org.apache.hadoop.yarn.server.api.protocolrecords.NodeHeartbeatResponse;
42 import org.apache.hadoop.yarn.server.api.records.MasterKey;
43 import org.apache.hadoop.yarn.server.api.records.NodeAction;
44 import org.apache.hadoop.yarn.server.api.records.impl.pb.MasterKeyPBImpl;
45 
46 
47 
48 public class NodeHeartbeatResponsePBImpl extends
49     ProtoBase<NodeHeartbeatResponseProto> implements NodeHeartbeatResponse {
50   NodeHeartbeatResponseProto proto = NodeHeartbeatResponseProto.getDefaultInstance();
51   NodeHeartbeatResponseProto.Builder builder = null;
52   boolean viaProto = false;
53 
54   private List<ContainerId> containersToCleanup = null;
55   private List<ContainerId> containersToBeRemovedFromNM = null;
56   private List<ApplicationId> applicationsToCleanup = null;
57   private Map<ApplicationId, ByteBuffer> systemCredentials = null;
58 
59   private MasterKey containerTokenMasterKey = null;
60   private MasterKey nmTokenMasterKey = null;
61 
NodeHeartbeatResponsePBImpl()62   public NodeHeartbeatResponsePBImpl() {
63     builder = NodeHeartbeatResponseProto.newBuilder();
64   }
65 
NodeHeartbeatResponsePBImpl(NodeHeartbeatResponseProto proto)66   public NodeHeartbeatResponsePBImpl(NodeHeartbeatResponseProto proto) {
67     this.proto = proto;
68     viaProto = true;
69   }
70 
getProto()71   public NodeHeartbeatResponseProto getProto() {
72     mergeLocalToProto();
73     proto = viaProto ? proto : builder.build();
74     viaProto = true;
75     return proto;
76   }
77 
mergeLocalToBuilder()78   private void mergeLocalToBuilder() {
79     if (this.containersToCleanup != null) {
80       addContainersToCleanupToProto();
81     }
82     if (this.applicationsToCleanup != null) {
83       addApplicationsToCleanupToProto();
84     }
85     if (this.containersToBeRemovedFromNM != null) {
86       addContainersToBeRemovedFromNMToProto();
87     }
88     if (this.containerTokenMasterKey != null) {
89       builder.setContainerTokenMasterKey(
90           convertToProtoFormat(this.containerTokenMasterKey));
91     }
92     if (this.nmTokenMasterKey != null) {
93       builder.setNmTokenMasterKey(
94           convertToProtoFormat(this.nmTokenMasterKey));
95     }
96     if (this.systemCredentials != null) {
97       addSystemCredentialsToProto();
98     }
99   }
100 
addSystemCredentialsToProto()101   private void addSystemCredentialsToProto() {
102     maybeInitBuilder();
103     builder.clearSystemCredentialsForApps();
104     for (Map.Entry<ApplicationId, ByteBuffer> entry : systemCredentials.entrySet()) {
105       builder.addSystemCredentialsForApps(SystemCredentialsForAppsProto.newBuilder()
106         .setAppId(convertToProtoFormat(entry.getKey()))
107         .setCredentialsForApp(ProtoUtils.convertToProtoFormat(
108             entry.getValue().duplicate())));
109     }
110   }
111 
mergeLocalToProto()112   private void mergeLocalToProto() {
113     if (viaProto)
114       maybeInitBuilder();
115     mergeLocalToBuilder();
116     proto = builder.build();
117     viaProto = true;
118   }
119 
maybeInitBuilder()120   private void maybeInitBuilder() {
121     if (viaProto || builder == null) {
122       builder = NodeHeartbeatResponseProto.newBuilder(proto);
123     }
124     viaProto = false;
125   }
126 
127 
128   @Override
getResponseId()129   public int getResponseId() {
130     NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder;
131     return (p.getResponseId());
132   }
133 
134   @Override
setResponseId(int responseId)135   public void setResponseId(int responseId) {
136     maybeInitBuilder();
137     builder.setResponseId((responseId));
138   }
139 
140   @Override
getContainerTokenMasterKey()141   public MasterKey getContainerTokenMasterKey() {
142     NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder;
143     if (this.containerTokenMasterKey != null) {
144       return this.containerTokenMasterKey;
145     }
146     if (!p.hasContainerTokenMasterKey()) {
147       return null;
148     }
149     this.containerTokenMasterKey =
150         convertFromProtoFormat(p.getContainerTokenMasterKey());
151     return this.containerTokenMasterKey;
152   }
153 
154   @Override
setContainerTokenMasterKey(MasterKey masterKey)155   public void setContainerTokenMasterKey(MasterKey masterKey) {
156     maybeInitBuilder();
157     if (masterKey == null)
158       builder.clearContainerTokenMasterKey();
159     this.containerTokenMasterKey = masterKey;
160   }
161 
162   @Override
getNMTokenMasterKey()163   public MasterKey getNMTokenMasterKey() {
164     NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder;
165     if (this.nmTokenMasterKey != null) {
166       return this.nmTokenMasterKey;
167     }
168     if (!p.hasNmTokenMasterKey()) {
169       return null;
170     }
171     this.nmTokenMasterKey =
172         convertFromProtoFormat(p.getNmTokenMasterKey());
173     return this.nmTokenMasterKey;
174   }
175 
176   @Override
setNMTokenMasterKey(MasterKey masterKey)177   public void setNMTokenMasterKey(MasterKey masterKey) {
178     maybeInitBuilder();
179     if (masterKey == null)
180       builder.clearNmTokenMasterKey();
181     this.nmTokenMasterKey = masterKey;
182   }
183 
184   @Override
getNodeAction()185   public NodeAction getNodeAction() {
186     NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder;
187     if (!p.hasNodeAction()) {
188       return null;
189     }
190     return (convertFromProtoFormat(p.getNodeAction()));
191   }
192 
193   @Override
setNodeAction(NodeAction nodeAction)194   public void setNodeAction(NodeAction nodeAction) {
195     maybeInitBuilder();
196     if (nodeAction == null) {
197       builder.clearNodeAction();
198       return;
199     }
200     builder.setNodeAction(convertToProtoFormat(nodeAction));
201   }
202 
203   @Override
getDiagnosticsMessage()204   public String getDiagnosticsMessage() {
205     NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder;
206     if (!p.hasDiagnosticsMessage()) {
207       return null;
208     }
209     return p.getDiagnosticsMessage();
210   }
211 
212   @Override
setDiagnosticsMessage(String diagnosticsMessage)213   public void setDiagnosticsMessage(String diagnosticsMessage) {
214     maybeInitBuilder();
215     if (diagnosticsMessage == null) {
216       builder.clearDiagnosticsMessage();
217       return;
218     }
219     builder.setDiagnosticsMessage((diagnosticsMessage));
220   }
221 
222   @Override
getContainersToCleanup()223   public List<ContainerId> getContainersToCleanup() {
224     initContainersToCleanup();
225     return this.containersToCleanup;
226   }
227 
228   @Override
getContainersToBeRemovedFromNM()229   public List<ContainerId> getContainersToBeRemovedFromNM() {
230     initContainersToBeRemovedFromNM();
231     return this.containersToBeRemovedFromNM;
232   }
233 
initContainersToCleanup()234   private void initContainersToCleanup() {
235     if (this.containersToCleanup != null) {
236       return;
237     }
238     NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder;
239     List<ContainerIdProto> list = p.getContainersToCleanupList();
240     this.containersToCleanup = new ArrayList<ContainerId>();
241 
242     for (ContainerIdProto c : list) {
243       this.containersToCleanup.add(convertFromProtoFormat(c));
244     }
245   }
246 
initContainersToBeRemovedFromNM()247   private void initContainersToBeRemovedFromNM() {
248     if (this.containersToBeRemovedFromNM != null) {
249       return;
250     }
251     NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder;
252     List<ContainerIdProto> list = p.getContainersToBeRemovedFromNmList();
253     this.containersToBeRemovedFromNM = new ArrayList<ContainerId>();
254 
255     for (ContainerIdProto c : list) {
256       this.containersToBeRemovedFromNM.add(convertFromProtoFormat(c));
257     }
258   }
259 
260   @Override
addAllContainersToCleanup( final List<ContainerId> containersToCleanup)261   public void addAllContainersToCleanup(
262       final List<ContainerId> containersToCleanup) {
263     if (containersToCleanup == null)
264       return;
265     initContainersToCleanup();
266     this.containersToCleanup.addAll(containersToCleanup);
267   }
268 
269   @Override
270   public void
addContainersToBeRemovedFromNM(final List<ContainerId> containers)271       addContainersToBeRemovedFromNM(final List<ContainerId> containers) {
272     if (containers == null)
273       return;
274     initContainersToBeRemovedFromNM();
275     this.containersToBeRemovedFromNM.addAll(containers);
276   }
277 
addContainersToCleanupToProto()278   private void addContainersToCleanupToProto() {
279     maybeInitBuilder();
280     builder.clearContainersToCleanup();
281     if (containersToCleanup == null)
282       return;
283     Iterable<ContainerIdProto> iterable = new Iterable<ContainerIdProto>() {
284 
285       @Override
286       public Iterator<ContainerIdProto> iterator() {
287         return new Iterator<ContainerIdProto>() {
288 
289           Iterator<ContainerId> iter = containersToCleanup.iterator();
290 
291           @Override
292           public boolean hasNext() {
293             return iter.hasNext();
294           }
295 
296           @Override
297           public ContainerIdProto next() {
298             return convertToProtoFormat(iter.next());
299           }
300 
301           @Override
302           public void remove() {
303             throw new UnsupportedOperationException();
304 
305           }
306         };
307 
308       }
309     };
310     builder.addAllContainersToCleanup(iterable);
311   }
312 
addContainersToBeRemovedFromNMToProto()313   private void addContainersToBeRemovedFromNMToProto() {
314     maybeInitBuilder();
315     builder.clearContainersToBeRemovedFromNm();
316     if (containersToBeRemovedFromNM == null)
317       return;
318     Iterable<ContainerIdProto> iterable = new Iterable<ContainerIdProto>() {
319 
320       @Override
321       public Iterator<ContainerIdProto> iterator() {
322         return new Iterator<ContainerIdProto>() {
323 
324           Iterator<ContainerId> iter = containersToBeRemovedFromNM.iterator();
325 
326           @Override
327           public boolean hasNext() {
328             return iter.hasNext();
329           }
330 
331           @Override
332           public ContainerIdProto next() {
333             return convertToProtoFormat(iter.next());
334           }
335 
336           @Override
337           public void remove() {
338             throw new UnsupportedOperationException();
339 
340           }
341         };
342 
343       }
344     };
345     builder.addAllContainersToBeRemovedFromNm(iterable);
346   }
347 
348   @Override
getApplicationsToCleanup()349   public List<ApplicationId> getApplicationsToCleanup() {
350     initApplicationsToCleanup();
351     return this.applicationsToCleanup;
352   }
353 
initApplicationsToCleanup()354   private void initApplicationsToCleanup() {
355     if (this.applicationsToCleanup != null) {
356       return;
357     }
358     NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder;
359     List<ApplicationIdProto> list = p.getApplicationsToCleanupList();
360     this.applicationsToCleanup = new ArrayList<ApplicationId>();
361 
362     for (ApplicationIdProto c : list) {
363       this.applicationsToCleanup.add(convertFromProtoFormat(c));
364     }
365   }
366 
367   @Override
addAllApplicationsToCleanup( final List<ApplicationId> applicationsToCleanup)368   public void addAllApplicationsToCleanup(
369       final List<ApplicationId> applicationsToCleanup) {
370     if (applicationsToCleanup == null)
371       return;
372     initApplicationsToCleanup();
373     this.applicationsToCleanup.addAll(applicationsToCleanup);
374   }
375 
addApplicationsToCleanupToProto()376   private void addApplicationsToCleanupToProto() {
377     maybeInitBuilder();
378     builder.clearApplicationsToCleanup();
379     if (applicationsToCleanup == null)
380       return;
381     Iterable<ApplicationIdProto> iterable = new Iterable<ApplicationIdProto>() {
382 
383       @Override
384       public Iterator<ApplicationIdProto> iterator() {
385         return new Iterator<ApplicationIdProto>() {
386 
387           Iterator<ApplicationId> iter = applicationsToCleanup.iterator();
388 
389           @Override
390           public boolean hasNext() {
391             return iter.hasNext();
392           }
393 
394           @Override
395           public ApplicationIdProto next() {
396             return convertToProtoFormat(iter.next());
397           }
398 
399           @Override
400           public void remove() {
401             throw new UnsupportedOperationException();
402 
403           }
404         };
405 
406       }
407     };
408     builder.addAllApplicationsToCleanup(iterable);
409   }
410 
411 
412   @Override
getSystemCredentialsForApps()413   public Map<ApplicationId, ByteBuffer> getSystemCredentialsForApps() {
414     if (this.systemCredentials != null) {
415       return this.systemCredentials;
416     }
417     initSystemCredentials();
418     return systemCredentials;
419   }
420 
initSystemCredentials()421   private void initSystemCredentials() {
422     NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder;
423     List<SystemCredentialsForAppsProto> list = p.getSystemCredentialsForAppsList();
424     this.systemCredentials = new HashMap<ApplicationId, ByteBuffer> ();
425     for (SystemCredentialsForAppsProto c : list) {
426       ApplicationId appId = convertFromProtoFormat(c.getAppId());
427       ByteBuffer byteBuffer = ProtoUtils.convertFromProtoFormat(c.getCredentialsForApp());
428       this.systemCredentials.put(appId, byteBuffer);
429     }
430   }
431 
432   @Override
setSystemCredentialsForApps( Map<ApplicationId, ByteBuffer> systemCredentials)433   public void setSystemCredentialsForApps(
434       Map<ApplicationId, ByteBuffer> systemCredentials) {
435     if (systemCredentials == null || systemCredentials.isEmpty()) {
436       return;
437     }
438     maybeInitBuilder();
439     this.systemCredentials = new HashMap<ApplicationId, ByteBuffer>();
440     this.systemCredentials.putAll(systemCredentials);
441   }
442 
443   @Override
getNextHeartBeatInterval()444   public long getNextHeartBeatInterval() {
445     NodeHeartbeatResponseProtoOrBuilder p = viaProto ? proto : builder;
446     return (p.getNextHeartBeatInterval());
447   }
448 
449   @Override
setNextHeartBeatInterval(long nextHeartBeatInterval)450   public void setNextHeartBeatInterval(long nextHeartBeatInterval) {
451     maybeInitBuilder();
452     builder.setNextHeartBeatInterval(nextHeartBeatInterval);
453   }
454 
convertFromProtoFormat(ContainerIdProto p)455   private ContainerIdPBImpl convertFromProtoFormat(ContainerIdProto p) {
456     return new ContainerIdPBImpl(p);
457   }
458 
convertToProtoFormat(ContainerId t)459   private ContainerIdProto convertToProtoFormat(ContainerId t) {
460     return ((ContainerIdPBImpl) t).getProto();
461   }
462 
convertFromProtoFormat(ApplicationIdProto p)463   private ApplicationIdPBImpl convertFromProtoFormat(ApplicationIdProto p) {
464     return new ApplicationIdPBImpl(p);
465   }
466 
convertToProtoFormat(ApplicationId t)467   private ApplicationIdProto convertToProtoFormat(ApplicationId t) {
468     return ((ApplicationIdPBImpl) t).getProto();
469   }
470 
convertFromProtoFormat(NodeActionProto p)471   private NodeAction convertFromProtoFormat(NodeActionProto p) {
472     return NodeAction.valueOf(p.name());
473   }
474 
convertToProtoFormat(NodeAction t)475   private NodeActionProto convertToProtoFormat(NodeAction t) {
476     return NodeActionProto.valueOf(t.name());
477   }
478 
convertFromProtoFormat(MasterKeyProto p)479   private MasterKeyPBImpl convertFromProtoFormat(MasterKeyProto p) {
480     return new MasterKeyPBImpl(p);
481   }
482 
convertToProtoFormat(MasterKey t)483   private MasterKeyProto convertToProtoFormat(MasterKey t) {
484     return ((MasterKeyPBImpl) t).getProto();
485   }
486 }
487 
488